リサイズで文字が消えちゃう
- キーダウンした場合にウインドウに文字が表示されるが、別のウインドウに隠れて再表示時に消えてしまう問題への解決方法を教えてください。
- キーが押された場合にフラグを true にし、ウインドウの再描画時にフラグをチェックして文字を表示する方法を考えていますが、BCC32 でコンパイルするためのソースコードを教えてください。
- もしくは、より効果的な方法があれば教えてください。
- ベストアンサー
リサイズで文字が消えちゃう
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; char *str; switch (msg) { case WM_KEYDOWN: hdc = GetDC(hWnd); str = "キーダウンした"; TextOut(hdc,1,1,str,strlen(str)); ReleaseDC(hWnd,hdc); break; キーを押すと、LRESULT CALLBACK でウインドウに文字が 表示されるようにしました。 でも、この文字は別のウインドウに隠れて、再びウインドウが 表示された場合とかには消えています。 消えないようにするためにはどうしたらいいですか? void Swit(HWND hWnd) { HDC hdc; char *str; if (キーダウンのフラグがあったとして、それが true なら) { hdc = GetDC(hWnd); str = "キーダウンした"; TextOut(hdc,1,1,str,strlen(str)); ReleaseDC(hWnd,hdc); } return; } if ( ウインドウ再描画 == true ){ Swit() } というのを考えました。 LRESULT CALLBACK で、キーが押された場合にフラグを true にして ウインドウが再描画された場合にフラグをチェックして文字を 表示する という方法を考えたんだけど、これを BCC32 でコンパイル するためにはどういうソースを書いたらいいか分からないし、 もっといい方法があれば教えてください。
- A__
- お礼率59% (194/328)
- C・C++・C#
- 回答数2
- ありがとう数3
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
低レベルAPIで描画処理を行った場合は、WM_PAINT(再描画)が発生したタイミングで 再度描画処理する必要があります。 従って、WM_PAINTイベントのCase文を追加して描画処理をする事です。
その他の回答 (1)
ウインドウ再描画が必要になると、WM_PAINT メッセージが発生します。ヘルプなどで確認してみてください。 WM_PAINTではBeginPaintとEndPaintを使ってください。HDCはGetDCではなく、BeginPaintで取得されたものを使用します。
お礼
ありがとうございました。
関連するQ&A
- TextOut( ) を BeginPaint( ) と GetDC( )
LRESULT CALLBACK の case WM_PAINT: で、 hdc = BeginPaint(hWnd, &ps); TextOut(hdc,0,0,str,strlen(str)); EndPaint(hWnd, &ps); ↑問題無し。↓文字がちらつく。 hdc = GetDC(hWnd); TextOut(hdc,0,0,str,strlen(str)); ReleaseDC(hWnd,hdc); ちらつきの原因は、高速で TextOut( ) が繰り返されるから だと思いました。 どうして TextOut( ) が繰り返されるんですか? 上の方法の場合は、 ReleaseDC(hWnd,hdc); は書かなくてもいいですか?
- ベストアンサー
- C・C++・C#
- VOID型をSTRUCTのように
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){ HDC hDC; PAINTSTRUCT ps; static void *v = "abcdefg"; switch(msg){ case WM_PAINT: hDC = GetDC(hWnd); TextOut(hDC, 0, 0, (char*)v, strlen((char *)v)); ReleaseDC(hWnd, hDC); ValidateRect(hWnd, NULL); break; これで abcdefg が表示されるけど、defg を表示される方法が 分かりません。 abcdefg の文字列の長さは不明です。 char buf[1000]; のように大きく確保すればいいんだけど、そういうのをせず、 動的にやろうと考えています。 TextOut(hDC, 0, 0, &(((char*)v)+3), strlen((char *)v)-3); だと、メモリ上に配置されなければならない というエラーになります。 よい方法があったら教えてください。
- ベストアンサー
- C・C++・C#
- なぜhButton1ボタンからのWM_COMMANDはフックできてクライアントエリアのWM_RBUTTONDOWNはフックできないのでしょうか?
#define STRLBUTTON TEXT("マウス左ボタンが押されました from mainProc") #define STRRBUTTON TEXT("マウス右ボタンが押されました from my_HookProc") #define STRCOMMAND TEXT("ボタンが押されました") HWND hButton1; LRESULT CALLBACK my_HookProc(int nCode, WPARAM wParam, LPARAM lParam) { CWPRETSTRUCT *pcwpRetStruct = (CWPRETSTRUCT *)lParam; HDC hDC; if(nCode==HC_ACTION) { hDC = GetDC(pcwpRetStruct->hwnd); switch(pcwpRetStruct->message) { case WM_COMMAND: TextOut(hDC, 10, 10, STRCOMMAND, strlen(STRCOMMAND)); break; case WM_RBUTTONDOWN: TextOut(hDC, 10, 10, STRRBUTTON, strlen(STRRBUTTON)); break; } ReleaseDC(pcwpRetStruct->hwnd, hDC); } return CallNextHookEx(NULL, nCode, wParam, lParam); } LRESULT CALLBACK mainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { static HHOOK hHook; HDC hDC; switch(uMsg) { case WM_DESTROY: UnhookWindowsHookEx(hHook); PostQuitMessage(0); return 0; case WM_CREATE: hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, my_HookProc, NULL, GetCurrentThreadId() ); if(!hHook) MessageBox(NULL, "hooking failed", NULL, MB_OK); hButton1 = CreateWindow( "BUTTON", "hButton1", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 40, 100, 20, hWnd, NULL, ((LPCREATESTRUCT)lParam)->hInstance, NULL ); return 0; case WM_LBUTTONDOWN: hDC = GetDC(hWnd); TextOut(hDC, 10, 10, STRLBUTTON, strlen(STRLBUTTON)); ReleaseDC(hWnd, hDC); return 0; } return DefWindowProc(hWnd, uMsg, wParam, lParam); }
- ベストアンサー
- C・C++・C#
- TextOut( ) が動かない
LRESULT CALLBACK WndProc( HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){ PAINTSTRUCT ps; HDC hdc; switch(msg){ case WM_KEYDOWN: if( wParam == VK_ESCAPE ){ hdc = BeginPaint(hWnd, &ps); TextOut(hdc,0,0,str,strlen(str)); EndPaint(hWnd, &ps); } break; case WM_PAINT: break; エスケープキーで文字表示をやりたいけど TextOut( ) が動作していないみたいでした。 switch(msg){ case WM_KEYDOWN: if( wParam == VK_ESCAPE ){ hdc = BeginPaint(hWnd, &ps); TextOut(hdc,0,0,str,strlen(str)); EndPaint(hWnd, &ps); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); TextOut(hdc,0,0,str,strlen(str)); EndPaint(hWnd, &ps); break; とすると、常に文字が表示されたから、やっぱり case WM_KEYDOWN: の中の TextOut( ) が 動作していないんだと思いました。 TextOut( ) は case WM_PAINT: からのつながりが ある場合でないと実行されないんですか? ソースのおかしいところがあったら教えてください。
- ベストアンサー
- C・C++・C#
- WM_PAINT
WM_PAINT について教えてほしいのですが、 WM_PAINTがシステムから発行されるタイミングとして、 クライアント領域に無効領域がある時 UpdateWindow()を呼び出した時 InvalidateRect()を呼び出した時があると思いますが 例えば LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM) { LPCTSTR Str = TEXT("Kitty"); switch (msg) { case WM_CREATE: hdc = GetDC(hwnd); SetTextColor(hdc , RGB(255, 0 , 0)); ReleaseDC(hwnd , hdc); return 0; case WM_PAINT: hdc = BeginPaint(hwnd , &ps); TextOut(hdc, 10 , 10 , Str, lstrlen(Str)); EndPaint(hwnd , &ps); return 0; } return DefWindowProc(hwnd , msg , wp , lp); } の場合, WM_PAINTはどのタイミングでシステムから呼び出されるんですか? WinMain()でUpdateWindow()もInvalidateRect()もつかっていないのですが。 いつシステムから送られるかご教授をお願いします。
- ベストアンサー
- C・C++・C#
- 自作関数の使い方
ウインドウの左上に1を表示させたいのに デスクトップの左上に1が表示される。 ソースを直してください。 #include <windows.h> HWND hWnd; void f(); LRESULT CALLBACK WndProc(HWND ,UINT ,WPARAM ,LPARAM); int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE ,LPSTR , int){ HWND hWnd; MSG msg; WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.lpszMenuName = NULL; wc.lpszClassName = "CNAME"; wc.hIcon = LoadIcon(NULL , IDI_APPLICATION); wc.hCursor = LoadCursor(NULL , IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); if (!RegisterClass(&wc))return 0; hWnd = CreateWindow(wc.lpszClassName , "EXE" , WS_OVERLAPPEDWINDOW | WS_VISIBLE , CW_USEDEFAULT , CW_USEDEFAULT , 200 , 150, NULL , NULL , hInstance , NULL); while(GetMessage(&msg , NULL , 0 , 0)){ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd ,UINT msg ,WPARAM wParam ,LPARAM lParam){ HDC hDC; switch (msg){ case WM_LBUTTONDOWN: f(); break; case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd , msg , wParam , lParam)); } return (0L); } void f(){ HDC hDC; hDC = GetDC(hWnd); TextOut(hDC,0,0,"1",1); ReleaseDC(hWnd, hDC); }
- ベストアンサー
- C・C++・C#
- static で宣言
LRESULT CALLBACK WinProc(HWND hWnd, UINT msg,WPARAM wP, LPARAM lP){ static char str = 'a'; 1回目の WinProc() 実行の時しか static char str = 'a'; は実行されない。 LRESULT CALLBACK WinProc(HWND hWnd, UINT msg,WPARAM wP, LPARAM lP){ char str = 'a'; としても、1回目の WinProc() 実行の時しか char str = 'a'; は 実行されないんですか?
- ベストアンサー
- C・C++・C#
- 別関数に渡す変数のポインタが難しい
構造体初心者で、ポインタもよく分かっていません。 12, 8 と表示するつもりのソースだけど、実行結果は違っていました。 直してください。 ソースは長いけど、スケルトンに構造体とTextOutを付けたぐらいのものです。 #include <windows.h> struct MYOBJ { int a; int b; }; LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int) { MSG msg; WNDCLASS wc; 投稿できなかったからここを消しました。 wc.lpszClassName = "x"; if(RegisterClass(&wc) == 0)return 0; HWND hWnd = CreateWindow("x","",WS_OVERLAPPEDWINDOW|WS_VISIBLE,0,0,320,240,NULL,NULL,hInst,NULL); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } void myfunc(struct MYOBJ *obj)//ここが違うかもしれません。 { obj->a += 2; obj->b -= 2; } LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { HDC hDC; PAINTSTRUCT ps; char buf[30]; switch(uMsg) { case WM_CREATE: struct MYOBJ myobj; myobj.a = 10; myobj.b = 10; myfunc(&myobj);//ここが違うかもしれません。 return 0; case WM_PAINT: hDC = BeginPaint(hWnd, &ps); wsprintf(buf, "%d, %d", myobj.a, myobj.b); TextOut(hDC, 0, 0, buf, strlen(buf)); EndPaint(hWnd, &ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; }
- ベストアンサー
- C・C++・C#
- 何もしないメッセージだけ表示するウィンドウ
ゲーム用に何もしないメッセージだけ表示するウィンドウを作りたいのですが、 猫でもわかるゲームプログラミングのコードが間違っているのか、 機能しません。 #include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { return (int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg){ } return 0; } このように、打ち込んだのですが、どこが間違っているのか解りません。 回答お願いいたします。
- ベストアンサー
- その他([技術者向] コンピューター)
お礼
ありがとうございます。 WM_PAINTイベントのCase文でできました。