InvalidateRect Windowsアプリ

このQ&Aのポイント
  • WindowsアプリケーションでのInvalidateRectの動作について質問です。
  • 他のcppファイルでInvalidateRectを使用したところ、WM_PAINTにメッセージが送られない状況です。
  • hParentを用いてInvalidateRectを呼び出していますが、描画処理が行われません。どのように対処すべきでしょうか。
回答を見る
  • ベストアンサー

InvalidateRect Windowsアプリ

初歩的な質問すみません。 現在、Windowsアプリケーションでプログラミングをしています。 cppファイルを複数使ってプロジェクトを作成したいので、 【下記ソース】のような感じで、ウィンドウハンドルhWnd を グローバル変数hParentに格納し、 他のcppファイルからでもウィンドウハンドルを使った記述ができるようにしたつもりです。 ここからが本題なのですが、 他のcppファイルで hParentを用いてInvalidateRectを使用したところ、 WM_PAINTにメッセージが送られることなく、そのまま処理を続けてしまっています。 他のcppファイルの記述ですが、グローバル変数 HWND hParentを用いて  InvalidateRect(hParent, NULL, FALSE); と書いています。 戻り値には1が入っていたので失敗はしていないようです。 私としては、WM_PAINTにとんで、そこで描画処理をしてほしかったのですが・・・ アドバイスお願いします。 <環境> Microsoft Windows XP Professional Version 2002 Service Pack 3 Microsoft Visual Studio Academic Edition 2005 【下記ソース】 ----------------------------- // グローバル変数 extern HWND hParent // インスタンスハンドルを保存し、メインウィンドウを作成 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // グローバル変数にインスタンス処理を格納します。 hWnd = CreateWindow(szWindowClass, TEXT("練習"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); hParent = hWnd; // グローバル変数にウィンドウハンドルを格納 return TRUE; } ----------------------------- ※上記関数のほかにも、こちらのcppファイル(ファイル(1))には、   APIENTRY _TWinMain関数や、CALLBACK WndProc関数などの大元が含まれています。   InvalidateRect関数を使っているのは、他のcppファイル(ファイル(2))ということです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

ひょっとして、InvalidateRectの代わりにUpdateWindowを使いましたか? UpdateWindowは、無効領域がある場合に描画をするので、InvalidateRectと一緒に使用しなければなりません。

panic_snow
質問者

お礼

回答ありがとうございます。 >ひょっとして、InvalidateRectの代わりにUpdateWindowを使いましたか? ご指摘していただいたとおりです。   InvalidateRect(hParent, NULL, FALSE);   UpdateWindow(hParent); のようにしたらWM_PAINTにメッセージを送ることができました。 ありがとうございました!

その他の回答 (1)

回答No.1

InvalidateRectは、Windowsに対して対象のウィンドウに無効領域があることを知らせます。 しかし、Windowsはすぐに描画をするわけではありません。 処理に優先順位をつけ、優先順位の高い処理から行います。画面の更新は、Windowsの処理の中ではかなり優先順位の低い部類に入ります。そのため、重い処理をすると、画面が更新されなくなったりすのです。 そもそもWindowsの場合、1つのメッセージを処理している間は、基本的に別のメッセージを処理できません。メッセージを処理して、WndProcからWindowsへ制御を移さないと、次のメッセージの処理は走りません。なので、無限ループのように長時間Windowsに制御を戻さないようなことをすると、画面の更新どころかボタンクリックなどの処理もされなくなります。 というわけで、InvalidateRectを実行しても、すぐに画面が更新されるわけではありません。 すぐに更新したい場合は、UpdateWinodwを呼び出します。

panic_snow
質問者

補足

早速の回答ありがとうございます。 m-take0220さんの回答を引用させていただきます。 >InvalidateRectを実行しても、すぐに画面が更新されるわけではあり >ません。すぐに更新したい場合は、UpdateWinodwを呼び出します。 早速、UpdateWindow(hParent); として使ってみましたがダメでした。 >無限ループのように長時間Windowsに制御を戻さないようなことをす >ると、画面の更新どころかボタンクリックなどの処理もされなくなりま >す。 InvalidateRect使用時でもUpdateWindow使用時でもどちらも重いような感じで、確かにボタンクリックなどもできなくなっていました。 通常InvalidateRectは、WM_TIMERの中で使うことが一般的かと思われます。しかし、私の場合、WM_COMMANDで、WPARAM wParam(コマンドメッセージ?) にIDM_MOVIE(メニュー[動画]が選択)が来たときに、処理が書いてある他ファイルの関数を呼び出し、そこで InvalidateRectしようとしているので、おかしなことになっているのかもしれないです。 プロジェクトのイメージとしては、   (1)メニュー[動画]が選択されたときは、     InvalidateRectなどを使い、描画する モード   (2)メニュー[計算]が選択されたときは、     描画は一切せずに、何らかの計算結果を出力する モード のように、2つの機能を有したものを1つのプロジェクトで作ろうと思ってます。 この2つのモードをうまく機能させたいのですが、どのように書くのが良いでしょうか? もしかしたら私の方法が根本的におかしいのかもしsれないので、何かアドバイスあればお願いします。

関連するQ&A

  • ウィンドウ枠をいちいち作るのがめんどくさい

    ウィンドウの作成の部分を書き出してみました。 BOOL InitInstance(HINSTANCE hInst,int nCmdShow) { HWND hWnd; hWnd=CreateWindow(szClassName, TEXT("文字列を表示する"); WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL); if(!hWnd) return FALSE; ShowWindow(hwnd,nCmdShow); UpdateWindow(hWnd); return TRUE; } 毎回やるのはめんどくさいのでコピー&ペーストでもいいでしょうか? または、覚えた方がいいのでしょうか?

  • GetStockObject()で未定義エラーが発生する

    Eclipse3.0.2 + CDT2.0.1の環境でWindowsプログラムを作っているのですが、コンパイル時にGetStockObject()で未定義というエラーになり、コンパイルが通りません。 GetStockObject()を調べてみたところ、API関数のようなので、宣言はいらないと思っているのですが、間違いでしょうか?どうしたら、コンパイルが通るようになるでしょうか?教えてください。 #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); char szClassNme[] = "ウィンドウクラス・ネーム"; //メイン関数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HWND hWnd; MSG msg; WNDCLASS myProg; if (!hPrevInstance) { myProg.style =CS_HREDRAW | CS_VREDRAW; myProg.lpfnWndProc =WndProc; myProg.cbClsExtra =0; myProg.cbWndExtra =0; myProg.hInstance =hInstance; myProg.hIcon =NULL; myProg.hCursor =LoadCursor(NULL, IDC_ARROW); // myProg.hbrBackground=GetStockObject(WHITE_BRUSH); myProg.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); myProg.lpszMenuName=NULL; myProg.lpszClassName=szClassNme; if (!RegisterClass(&myProg)) return FALSE; } hWnd = CreateWindow(szClassNme, "あちょちょ", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (msg.wParam); }

  • BCCのコンソールアプリからウィンドウ表示

    BCCのコンソールアプリからウィンドウを表示したいのですが、うまくいきません。 なにが悪いのでしょうか・・・ どなたかお教えいただけると助かります。 よろしくお願いいたします。 コンパイラ: Borland C++ 5.5.1 bcc32 コンパイル方法: bcc32 -WC WindowTest.cpp (コンソールアプリにしているのは、標準入力を受け標準出力に出すフィルタ機能も持たせようと思っているからです。) *** ソース (WindowTest.cpp) *** #include <windows.h> LRESULT CALLBACK WndProc ( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp ){ // とりあえず空 (void)hWnd; (void)msg; (void)wp; (void)lp; return 0; } int main (int argc, char**argv){ HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL); WNDCLASSEX wc; char className[] = "hoge"; memset( &wc, 0, sizeof( wc )); wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wc.hCursor = LoadCursor( NULL, IDC_ARROW ); wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); wc.lpszMenuName = NULL; wc.lpszClassName = className; wc.hIconSm = NULL; if(! RegisterClassEx( &wc )) return 1; HWND hWnd = CreateWindow(className, "Title", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, NULL, hInstance, NULL); // ← ここで失敗し、ウィンドウが表示されない if (!hWnd) return 2; ShowWindow(hWnd, NULL); UpdateWindow(hWnd); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } (void)argc; (void)argv; return 0; }

  • ブレイクポイントについて

    #include <windows.h> LRESULT CALLBACK WndProc( HWND , UINT, WPARAM, LPARAM ); LRESULT CALLBACK WndProc1( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR , int nCmdShow ) { MSG msg; HWND hWnd, hWnd3; WNDCLASSEX wndclass,c_wndclass; wndclass.style = 0; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.cbSize = sizeof(WNDCLASSEX); wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wndclass.hIconSm = LoadIcon( NULL, IDI_WINLOGO ); wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "wh02"; c_wndclass.style = 0; c_wndclass.lpfnWndProc = WndProc1; c_wndclass.cbClsExtra = 0; c_wndclass.cbWndExtra = 0; c_wndclass.cbSize = sizeof(WNDCLASSEX); c_wndclass.hInstance = hInstance; c_wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION ); c_wndclass.hIconSm = LoadIcon( NULL, IDI_WINLOGO ); c_wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); c_wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); c_wndclass.lpszMenuName = NULL; c_wndclass.lpszClassName = "wh01"; if(! RegisterClassEx( &wndclass )) return 0; // ウィンドウクラスの登録 if(! RegisterClassEx( &c_wndclass )) return 0; // ウィンドウクラスの登録 // できないと終了   hWnd = CreateWindow( "wh02", "親ウインドウ(WS_OVERLAPPEDWINDOW)", WS_OVERLAPPEDWINDOW , CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, // 親ウィンドウはデスクトップ NULL, hInstance, NULL ); hWnd2 = CreateWindow( "hWnd1", "親ウインドウの子", WS_OVERLAPPEDWINDOW , CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWnd, // 親ウィンドウの子 NULL, hInstance, NULL ); ShowWindow( hWnd, nCmdShow ); UpdateWindow( hWnd ); ShowWindow( hWnd2, nCmdShow ); UpdateWindow( hWnd2 ); while( GetMessage( &msg, NULL, 0, 0 ) ){ TranslateMessage( &msg ); DispatchMessage( &msg ); } return msg.wParam ; } LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ) { default: ブレイクポイント3return DefWindowProc( hWnd, iMessage, wParam, lParam ); } return 0; } LRESULT CALLBACK WndProc1( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ) { case WM_DESTROY: ブレイクポイント1postQuitMessage(0); break; ブレイクポイント2return DefWindowProc( hWnd, iMessage, wParam, lParam ); } のプログラムを組んで実行して、ブレークポイントでやったのですがまず親ウィンドウの終了ボタンを押したらブレイクポイント1が通り、次にブレイクポイント2が通りここまではいいのですがブレイクポイント3が三回繰り返して実行されるのですが、なぜ三回繰り返されるのでしょうか?

  • CreateWindowの方法

    VisualC++ Express 2010 をインストールして 空のプロジェクトを作成し ウィンドウを作成するための、下記のソースコードを作成したのですが CreateWindow関数の戻り値が0になり、ウィンドウを作成することが 出来ません。 OSは、Windows7 Home Premium 32bit 版です。 ウィンドウを作成するには、どうすればよいのかご教示ください。 また、現象の発生理由をご存じのかたがいらっしゃればご教示ください。 --- ソースコードここから --- #include "windows.h" LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrecInstance, LPSTR lpCmdLine, int nCmdShow ) { WNDCLASSEX wcex; HWND hWnd; MSG msg; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(NULL,IDI_APPLICATION); wcex.hCursor = LoadCursor(NULL , IDC_ARROW); wcex.lpszMenuName = NULL; wcex.lpszClassName = "ModelApp"; wcex.hIconSm = LoadIcon(NULL,IDI_APPLICATION); RegisterClassEx(&wcex); hWnd = CreateWindow(wcex.lpszClassName, "Windows", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); (以下略) }

  • Windowsプログラミング

    識別子が無効ですといわれて困ってます。一応打ち込んだものを乗せておきます。VisualC++2008でやりました。 // sample01.cpp #include<windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTACE); BOOL InitInstance(HINSTANCE); TCHAR szClassName[] = TEXT("sample01"); // ウィンドウクラス int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; BOOL bRet; if (!InitApp(hCurInst)) return FALSE; if (!InitInstance(hCurInst, nCmdShow)) return FALSE; while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { if (bRet == -1) { MessageBox(NULL, TEXT("GetMessageエラー"), TEXT("Error"), MB_OK); break; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } } // ウィンドウクラスの登録 ATOM InitApp(HINSTANCE hInst) { WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndPrec; // プロシージャ名 wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; // インスタンス wc.hIcon = (HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hCursor = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; // メニュー名 wc.lpszClassName = szClassName; wc.hIconSm = (HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON 0, 0, LR_DEFAULTSIZE | LR_SHARED); return (RegisterClassEx(&wc)); } // ウィンドウの生成 BOOL InitInstance(HINSTANCE hInst, int nCmdShow) { HWND hWnd; hWnd = CreateWindow(szClassName, // タイトルバーにこの名前が表示されます TEXT("猫でもわかるWindowsプログラミング"), WS_OVERLAPPEDWINDOW, // ウィンドウの種類 CW_USEDEFAULT // x座標       CW_USEDEFAULT // y座標    CW_USEDEFAULT // 幅   CW_USEDEFAULT // 高さ NULL, // 親ウィンドウのハンドル、親を作るときはNULL NULL, // メニューハンドル、クラスメニューを // 使うときはNULL hInst, // インスタントハンドル NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } // ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UNIT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } 長いですがよろしくお願いします。 return 0; }

  • デフォルトウィンドウプロシージャ

    ある箇所が間違っていたので修正しました。ある本に子ウィンドウでデフォルトウィンドウプロシージャに渡すとそのメッセージは親ウィンドウすなわちトップレベルウィンドウへと渡されると載っていたので、試しにプログラムでやったのですが、 #include <windows.h> LRESULT CALLBACK WndProc( HWND , UINT, WPARAM, LPARAM ); LRESULT CALLBACK WndProc1( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR , int nCmdShow ) { MSG msg; HWND hWnd, hWnd3; WNDCLASSEX wndclass,c_wndclass; wndclass.style = 0; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.cbSize = sizeof(WNDCLASSEX); wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wndclass.hIconSm = LoadIcon( NULL, IDI_WINLOGO ); wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "wh02"; c_wndclass.style = 0; c_wndclass.lpfnWndProc = WndProc1; c_wndclass.cbClsExtra = 0; c_wndclass.cbWndExtra = 0; c_wndclass.cbSize = sizeof(WNDCLASSEX); c_wndclass.hInstance = hInstance; c_wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION ); c_wndclass.hIconSm = LoadIcon( NULL, IDI_WINLOGO ); c_wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); c_wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); c_wndclass.lpszMenuName = NULL; c_wndclass.lpszClassName = "wh01"; if(! RegisterClassEx( &wndclass )) return 0; // ウィンドウクラスの登録 if(! RegisterClassEx( &c_wndclass )) return 0; // ウィンドウクラスの登録 // できないと終了   hWnd = CreateWindow( "wh02", "親ウインドウ(WS_OVERLAPPEDWINDOW)", WS_OVERLAPPEDWINDOW , CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, // 親ウィンドウはデスクトップ NULL, hInstance, NULL ); hWnd3 = CreateWindow( "hWnd1", "親ウインドウの子", WS_OVERLAPPEDWINDOW , CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWnd, // 親ウィンドウの子 NULL, hInstance, NULL ); ShowWindow( hWnd, nCmdShow ); UpdateWindow( hWnd ); ShowWindow( hWnd3, nCmdShow ); UpdateWindow( hWnd3 ); while( GetMessage( &msg, NULL, 0, 0 ) ){ TranslateMessage( &msg ); DispatchMessage( &msg ); } return msg.wParam ; } LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ) { HDC hdc; PAINTSTRUCT ps; char *p; int id; switch( iMessage ){ case WM_KEYDOWN: id = MessageBox(hWnd, (LPCSTR)"終了しますか", (LPCSTR)"終了確認", MB_OKCANCEL | MB_ICONQUESTION); if(id == IDOK) DestroyWindow(hWnd); case WM_DESTROY: PostQuitMessage(0); // メッセージループを終了させる break; default: return DefWindowProc( hWnd, iMessage, wParam, lParam ); } return 0; } LRESULT CALLBACK WndProc1( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ) { return DefWindowProc( hWnd, iMessage, wParam, lParam ); } とやったのですが子ウィンドウでキー入力しても終了しません。 なぜなのでしょうか?何か間違っているのでしょうか?

  • win32apiにおける終了処理について

    下記のプログラムを実行してウィンドウを閉じるボタンで閉じると、 ウィンドウは消えるのですがなぜかプロセスが残ってしまいます。 正直、お手上げなので教えて頂けると幸いです。 よろしくお願いします。 #include<windows.h> #define APP_NAME TEXT("Sample_MainWindow") /*ウィンドウプロシージャ*/ LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch(uMsg) { case WM_DESTROY: PostQuitMessage(0); return 0; } /*基本的なメッセージの処理*/ return DefWindowProc(hWnd, uMsg,wParam,lParam); } /*WinMain*/ int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow) { HWND hWnd; WNDCLASS wc; MSG msg; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = DefWindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND + 1; wc.lpszMenuName = NULL; wc.lpszClassName = APP_NAME; if (!RegisterClass(&wc)){ MessageBox(NULL,TEXT("ウィンドウクラスの作成に失敗しました"),NULL,MB_OK); return 0; } hWnd = CreateWindow( APP_NAME, TEXT("Window Title"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); if(hWnd == NULL){ MessageBox(NULL,TEXT("ウィンドウの生成に失敗しました"),NULL,MB_OK); return 0; } /*メッセージループ*/ while(GetMessage(&msg, NULL,0,0)){ DispatchMessage(&msg); } return (int)msg.wParam; }

  • 子ウィンドウの作成方法

    #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); TCHAR szClassName[] = TEXT("Window01"); TCHAR szClassName2[] = TEXT("Window02"); int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,LPSTR lpsCmdLine, int nCmdShow){ MSG msg; BOOL bRet; if (!InitApp(hCurInst)) return FALSE; if (!InitInstance(hCurInst, nCmdShow)) return FALSE; while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { if (bRet == -1) { break; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int)msg.wParam; } ATOM InitApp(HINSTANCE hInst) { WNDCLASSEX wc; WNDCLASSEX wc2; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hIcon = (HICON)LoadImage( NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hCursor = (HCURSOR)LoadImage( NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szClassName; wc.hIconSm = (HICON)LoadImage( NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc2.cbSize = sizeof(WNDCLASSEX); wc2.style = CS_HREDRAW | CS_VREDRAW; wc2.lpfnWndProc = WndProc; wc2.cbClsExtra = 0; wc2.cbWndExtra = 0; wc2.hInstance = hInst; wc2.hIcon = (HICON)LoadImage( NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc2.hCursor = (HCURSOR)LoadImage( NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc2.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wc2.lpszMenuName = NULL; wc2.lpszClassName = szClassName; wc2.hIconSm = (HICON)LoadImage( NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); if((RegisterClassEx(&wc)||RegisterClassEx(&wc2)==0)) return 0; return TRUE; } BOOL InitInstance(HINSTANCE hInst, int nCmdShow) { HWND hWnd; HWND hWnd2; hWnd = CreateWindow(szClassName, TEXT("親ウィンドウ"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL ); if(!hWnd) return FALSE; hWnd2 = CreateWindow(szClassName2, TEXT("子ウィンドウ"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWnd, NULL, hInst, NULL ); if(!hWnd2) return FALSE; ShowWindow(hWnd, nCmdShow); ShowWindow(hWnd2, nCmdShow); UpdateWindow(hWnd); UpdateWindow(hWnd2); return TRUE; } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } 子ウィンドウの作り方を理解したく、ただウィンドウを表示するプログラムを作ろうとしました。 しかし、うまくいきません。 一体なにがダメなんでしょうか?

  • windowプログラム ARC C++

    今、windowプログラムで フォームの中に「エディットボックス」と「スタティックテキスト」の2つがあります。 内、スタティックテキスト内にARCで円を描き、表示したいのですがどのようにすればよいのでしょうか? 以上のことに悩んでおります。 某サイトで LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) { HDC hdc; PAINTSTRUCT ps; switch (msg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_PAINT: hdc = BeginPaint(hwnd , &ps); Arc(hdc , 10 , 10 , 200 , 200 , 0 , 100 , 0, 100); EndPaint(hwnd , &ps); return 0; } return DefWindowProc(hwnd , msg , wp , lp); } int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow ) { 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("-"); if (!RegisterClass(&winc)) return -1; hwnd = CreateWindow(      TEXT("-") , TEXT("-") , WS_OVERLAPPEDWINDOW | WS_VISIBLE , CW_USEDEFAULT , CW_USEDEFAULT , CW_USEDEFAULT , CW_USEDEFAULT ,      NULL , NULL , hInstance , NULL); if (hwnd == NULL) return -1; while(GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg); return msg.wParam; } をコピペしたのですが、スタティックテキスト内表示がわからなく梃子摺っております。 ご存知の方は回答・アドバイスのほどよろしくお願いいたします。

専門家に質問してみよう