ページ 11

Win32 プログラミング

Posted: 2017年1月02日(月) 22:16
by 駆け出し
こんばんは。今、自分でWindowsMediaPlayerもどきを作っています。CunstomDrawを使い、すでに再生されたエリアは青く塗るようにしたいのですが、塗られないままで、そのままです。(画像を添付します。)
どこが間違っているかを、ご教示していただけないでしょうか。(音源は、ネット上に公開されている著作権フリーのものを利用しております) MFP【Marron Fields Production】

こちらのソースは最新のものではありません。

CustomDraw部分
► スポイラーを表示
ウィンドウプロシージャ-
► スポイラーを表示
MP3ファイル読み込み部分
► スポイラーを表示
strdef.h
► スポイラーを表示

Re: Win32 プログラミング

Posted: 2017年1月04日(水) 09:00
by Math
VS2015上で再現してみようと思ったけどこれだけでは出来なさそうなので。”Debug"をされているようですが、switch (lpDraw->dwDrawStage)にブレークポイントを設定して[F11]でステップ実行されたらわかるのではありませんか?

Re: Win32 プログラミング

Posted: 2017年1月05日(木) 01:10
by 駆け出し
こんばんは。Debugをして、いくつか試行錯誤してみたのですが、関数:FillRectの戻り値は常に1なのです...
FillRect関数(MSDN)
また、いくつか試行錯誤した結果、余計に自分でもわからなくなってきてしまいました。(CustomDraw.cppの抜粋を見ていただけると助かります)
デタッチ(?)していないので結果が反映されないよ、ということは読んだのですが、c++かつ無償版のVC2015にはついていない機能を使っていたもので...

また、検証用に現在私が書いたソースコードすべて(ヘッダ、リソース含む)を置いておきます(バグあるかもです...)。
ヘッダファイルとソースファイルのパスを分けておいているので、一部修正しないと検証できないかもしれないです。お手数をおかけしますが、よろしくお願いします。

[追記]
いくつかのファイルにバグがあることと、処理を変更したので、新しい書き込みから、そちらに上がっているファイルはコピペしてください。
Zipを置いておきましたので、そちらからDownloadよろしくお願いします。
また、こちらのコードは最新のものではありません。
res.rc
► スポイラーを表示
strdef.h
► スポイラーを表示
rc.h
► スポイラーを表示
BaseFunc.cpp
► スポイラーを表示
CustomDraw.cppより
► スポイラーを表示
CustomDraw.cpp
► スポイラーを表示

Main.cpp
► スポイラーを表示
SoundAPI.cpp
► スポイラーを表示
UserInerface.cpp
► スポイラーを表示

Re: Win32 プログラミング

Posted: 2017年1月06日(金) 00:07
by 駆け出し
こんばんは。連投失礼します。
まず、検証用に置かせていただいたソースコードですが、バグがありました。申し訳ないです。

UserInterface.cppのGetUserFilesの、一つのファイルのみが選択されたときの処理を完全にDebugするのを忘れてました。(複数のほうのみチェックして油断してました。)つきましては、UserInerface.cppは次のようになります。また、新たに関数を追加しています。

こちらのコードは最新のものではありません。

UserInerface.cpp,strdef.h,Main.cpp,CunstomDraw.cpp
► スポイラーを表示
次に、青い部分の描画ですがWM_TIMERイベントがあるごとにSetTrackbarStatusを呼び出すことにより、更新部分を反映させることに成功しました。

勝手に一人で掲示板を荒らし、申し訳ありませんでした。

Re: Win32 プログラミング

Posted: 2017年1月06日(金) 00:30
by Math
>勝手に一人で掲示板を荒らし、申し訳ありませんでした。
掲示板を書くだけで気合いがはいるしプログラムも整理されるし”荒らし”てるわけではないと思います。
時にはすぐ”自己解決しました。”と風の如く去る人も...
"掲示板の効果”はで絶大ですよ。

Re: Win32 プログラミング

Posted: 2017年1月06日(金) 00:40
by Math
>関数:FillRectの戻り値は常に1なのです...
1はもしかしてTRUEでは...

Re: Win32 プログラミング

Posted: 2017年1月06日(金) 08:41
by Math
実際の開発現場ではスタブ (stub)とドライバー(driver)という考え方がある。
https://ja.wikipedia.org/wiki/%E3%82%B9 ... F%E3%83%96
このようにスタブ毎にテスト出来ないと自分でもわけが分からない"スパゲティ"プログラムになる。基本設計書をまず見せて頂き1ファイル事にテスト可能な設計になっているか検討する必要があります

Re: Win32 プログラミング

Posted: 2017年1月07日(土) 00:21
by Math
描画プログラムをテストするプログラムを考えてみました。

コード:

#include <windows.h>//////// 検証用プログラム:ドライバー:描画チェッカー
#include <stdio.h>////////// 2017/01/06 Writen by Math
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	HDC hdc;PAINTSTRUCT ps;static INT imode;POINT points[3];static INT ret;
	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:printf("<<<--->>>\n\n");
		imode = MessageBox(
			NULL , TEXT("return値を確認しますか?。") ,
			TEXT("SetPolyFillMode") , MB_YESNO
		);
		if (imode == IDYES) imode = WINDING;
		else imode = ALTERNATE;printf("001--->>>\n\n");
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hwnd , &ps);/////////////////////////////////////
		SelectObject(hdc , CreateSolidBrush(0xFF));
		SetPolyFillMode(hdc , imode);
		
		ret=Rectangle( hdc, 10, 20, 100, 110 );printf("ret=%d\n",ret);
        ret=Ellipse( hdc, 10, 20, 100, 110);printf("ret=%d\n",ret);

        points[0].x = 190; points[0].y =60;
        points[1].x = 120; points[1].y = 140;
        points[2].x = 260; points[2].y = 140;
 
        ret=Polygon( hdc, points, 3 );printf("ret=%d\n",ret);
        ret=TextOut(hdc, 130,10, TEXT("Hello World!"), 12);printf("ret=%d\n",ret);
        

		EndPaint(hwnd , &ps);
		DeleteObject(SelectObject(hdc , GetStockObject(WHITE_BRUSH)));
		return 0;
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}
///////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {////////////
    AllocConsole();///////////コンソール///////////////// ---[Debug Print]---
    FILE* out = 0; freopen_s( &out, "CON", "w", stdout );
    FILE* in = 0; freopen_s( &in, "CON", "r", stdin );
    ///            /////////Class////////////////////////
	HWND hwnd;	MSG msg;	WNDCLASS winc;
	winc.style		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("Form1");/////////Class//////////
	if (!RegisterClass(&winc)) return -1;////////Registe////////
	hwnd = CreateWindow(
			TEXT("Form1") , TEXT("Form1Samp") ,	WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,	CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL
	);//////////////////////////////////////////LOOP/////////////
	if (hwnd == NULL) return -1;
	while(GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg);
	//コンソール解放////////////////////////////コンソール/////// ---[Debug Print]---
    fclose( out ); fclose( in ); FreeConsole(); ////Close////////
	return msg.wParam;
}
///

Re: Win32 プログラミング

Posted: 2017年1月07日(土) 08:48
by Math
プロジェクト・ファイルを送って頂けるとコマンドライン・コンパイルができるので大変助かります。よろしくお願い致します。(.vcxprojファイルです)

Re: Win32 プログラミング

Posted: 2017年1月08日(日) 08:42
by 駆け出し
おはようございます。
実際の開発現場ではスタブ (stub)とドライバー(driver)という考え方がある。
https://ja.wikipedia.org/wiki/%E3%82%B9 ... F%E3%83%96
このようにスタブ毎にテスト出来ないと自分でもわけが分からない"スパゲティ"プログラムになる。基本設計書をまず見せて頂き1ファイル事にテスト可能な設計になっているか検討する必要があります
といいうことは、ここで○○を実装、あそこで××を実装、といった具合に決めてからコードを書くということでしょうか?
プロジェクト・ファイルを送って頂けるとコマンドライン・コンパイルができるので大変助かります。よろしくお願い致します。(.vcxprojファイルです)
添付しておきます。
コピペさせて申し訳ないです。これからはプロジェクトごと送ります...

.vcxprojは送れないようなので、zipにして送ります。
また、たぶん上にあるソースとは変わっているので、今編集している状態のソースを送ります.

Re: Win32 プログラミング

Posted: 2017年1月08日(日) 08:43
by 駆け出し
vcxobj ファイル

Re: Win32 プログラミング

Posted: 2017年1月08日(日) 08:47
by 駆け出し
今現在のソースコード

Re: Win32 プログラミング

Posted: 2017年1月08日(日) 08:58
by Math
>といいうことは、ここで○○を実装、あそこで××を実装、といった具合に決めてからコードを書くということでしょうか?
そうです。設計書をもとにスケルトンを作らないでいきなりプログラムを書くといずれ破綻します。
>.vcxprojは送れないようなので、zipにして送ります。
他のトピックスでは送ったり、送られたりしてますよ。コンテキストメニューの”送る”からエディタに送ればいいはずです。でも全部をzipで貰う方がありがたいですね。

Re: Win32 プログラミング

Posted: 2017年1月08日(日) 09:03
by 駆け出し
>といいうことは、ここで○○を実装、あそこで××を実装、といった具合に決めてからコードを書くということでしょうか?
そうです。設計書をもとにスケルトンを作らないでいきなりプログラムを書くといずれ破綻します。
なるほど、自分これまで何度か破たんしてる(なんでこの処理をしているかわからなくなる)ので、これからは何を実装するか決めてから実装します。

Re: Win32 プログラミング

Posted: 2017年1月08日(日) 11:09
by Math
Windows10,VS2015で正常に動きました。

Re: Win32 プログラミング

Posted: 2017年1月08日(日) 22:13
by 駆け出し
こんばんは。
Mathさん、いろいろ教えていただいてありがとうございました。

これにて、解決とさせていただきます。