• ベストアンサー

CS_HREDRAW|CS_VREDRAWについて

windowの雛形で、WNDCLASSEXのstyleでCS_HREDRAW|CS_VREDRAWを付けても0にしても変わらないのですが、CS_HREDRAW|CS_VREDRAWの意味はあるのでしょうか?CS_HREDRAW|CS_VREDRAWの意味はわかっているのですが、指定しても変わらなかったので質問させていただきました。

  • 79562
  • お礼率68% (164/239)

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

  • ベストアンサー
  • Yanch
  • ベストアンサー率50% (114/225)
回答No.2

> もう一つ質問なのですが基本的にCS_HREDRAW CS_VDRAW は付けといた方がいいのでしょうか? 場合によります。  ウィンドウのサイズが小さくなった時に再描画が必要な場合は、CS_HREDRAW CS_VREDRAW は必要でしょう。 例えば、 ・画像ビューアで、ウィンドウのサイズ変更した時に、表示する画像を伸縮表示する場合。 ・ウィンドウの右側や下側等に、現在時刻を表示するような場合。 > そのコードでやってみましたが、見た感じやっぱり変化なしです。どいうことなのでしょうか? WM_PAINTの呼ばれる条件が違う事が確認できると思いますが、コンソールを有効にして、 コンパイルしてみましたか? そもそも、ソースコードを動かしては見たけど、コード自体は読んでないとか だったりするのでしょうか。

79562
質問者

お礼

すみません。同じような結果になっていました。違いがわかってよかったです。回答ありがとうございました。

その他の回答 (1)

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

こちらの環境では、動作が変わるみたいです。 ・CS_HREDRAW CS_VDRAW 有効時   ウィンドウのサイズを小さくする時に、クライアント領域全体を再描画す   るように要求される。   ウィンドウサイズを大きくする時に、クライアント領域全体を再描画する   ように要求される。 ・CS_HREDRAW CS_VDRAW 無効時 ウィンドウサイズを小さくする時に、WM_PAINTが発生しない。 ウィンドウサイズを大きくする時に、クライアント領域の増えた領域を 再描画するように要求される。 のような結果でした。 以下、例です。 ---------------------------------------------------------------------- LRESULT CALLBACK MyWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {   RECT rect;   BOOL bErase;   BOOL boResult;      switch (uMsg)   {     case WM_DESTROY:       PostQuitMessage(0);       break;     case WM_PAINT:       printf("wm_paint\n");       bErase = FALSE;       boResult = GetUpdateRect(hWnd, &rect, bErase);       if (boResult)       {         printf("updateRect(%ld,%ld,%ld,%ld)\n", rect.left, rect.top             , rect.right, rect.bottom);       }       ValidateRgn(hWnd, NULL);       break;     default:       return DefWindowProc(hWnd, uMsg, wParam, lParam);   }   return 0L; }

79562
質問者

お礼

そのコードでやってみましたが、見た感じやっぱり変化なしです。どいうことなのでしょうか?

79562
質問者

補足

もう一つ質問なのですが基本的にCS_HREDRAW CS_VDRAW は付けといた方がいいのでしょうか?

関連するQ&A

  • アイコンを左上に表示したい

    今VC++.netでプログラミングの学習をしていて、アイコンをタイトルバーの左上に表示したいのですが、上手くいきません。 下のタスクバーにはアイコンが表示されているのですが、タイトルバーにはデフォルトの窓のようなアイコンしか表示されません。 リソースは、 #define IDI_ICON1 105 となっていて、以下のようにウインドウクラスを設定してあります。 //ウインドウクラス構造体を設定します。 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 = (HICON)LoadImage(hInstance,"IDI_ICON1",IMAGE_ICON,0,0,LR_DEFAULTSIZE | LR_SHARED); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = "ModelApp"; wcex.lpszClassName = "ModelApp"; wcex.hIconSm = (HICON)LoadImage(hInstance,"IDI_ICON1",IMAGE_ICON,0,0,LR_DEFAULTSIZE | LR_SHARED); 何かヒントでもいいので、よろしくお願いいたします。

  • ウィンドウの作成がうまくいきません。

    C++で一からWin32Apiでウィンドウを作ろうとしています。 単発のウィンドウ表示はうまくいったのですが、複数のウィンドウを表示しようとすると動作が怪しくなります。 以下にプログラムを載せさせて頂きますのでご指摘お願いします。 (1)LRESULT C_BaseWnd::LocalWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)の関数でメインウィンドウの処理を行っているのですが、メインウィンドウ上で「a(0x61)」キーを入力したとき新しくサブウィンドウを表示させています。その表示したサブウィンドウを閉じて再度メインウィンドウから「a(0x61)」キーを入力してサブウィンドウを表示しようとしても応答がありません。原因と改善方法を教えていただけるとうれしいです。 (2)そのほか全体的に「この記述おかしいだろう」「こうしたほうがいいんじゃないか」など細かいところでも良いので教えていただけるとうれしいです。 よろしくお願いします。 #include <Windows.h> class C_BaseWnd { public: C_BaseWnd(); virtual ~C_BaseWnd(); virtual HRESULT Init( HINSTANCE hInst, int nCmdShow, LPTSTR className, LPTSTR windowName, UINT width, UINT height, DWORD style, BOOL windowFlag ); virtual void Uninit(void); protected: WNDCLASSEX m_wndClassEx; HWND m_hWnd; // 親のウィンドウプロシージャ virtual LRESULT LocalWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); // 子のウィンドウプロシージャ virtual LRESULT ChildWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); private: // 個々のウィンドウプロシージャを呼び出すコールバック static LRESULT CALLBACK s_CallWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); // メインウィンドウフラグ格納 bool m_bMain; }; int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow ) { // 初期化処理 C_BaseWnd *window = new C_BaseWnd(); window->Init( hCurInst, nCmdShow, "Application Name", "Window Name", 1280, 720, WS_OVERLAPPEDWINDOW, true ); MSG msg; while( GetMessage(&msg, NULL, 0, 0) ) { TranslateMessage(&msg); DispatchMessage(&msg); } window->Uninit(); delete window; return 0; } C_BaseWnd::C_BaseWnd() { m_hWnd = NULL; m_bMain = false; } C_BaseWnd::~C_BaseWnd() { } HRESULT C_BaseWnd::Init(HINSTANCE hInst, int nCmdShow, LPTSTR className, LPTSTR windowName, UINT width, UINT height, DWORD style, BOOL windowFlag) { m_wndClassEx.cbSize = sizeof(WNDCLASSEX); m_wndClassEx.lpfnWndProc = s_CallWindProc; m_wndClassEx.style = (CS_HREDRAW | CS_VREDRAW); m_wndClassEx.cbClsExtra = 0; m_wndClassEx.cbWndExtra = 0; m_wndClassEx.hInstance = hInst; m_wndClassEx.hIcon = NULL; m_wndClassEx.hCursor = LoadCursor(NULL, IDC_ARROW); m_wndClassEx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); m_wndClassEx.lpszMenuName = NULL; m_wndClassEx.lpszClassName = className; m_wndClassEx.hIconSm = NULL; if( RegisterClassEx(&m_wndClassEx) == 0 ) return E_FAIL; m_hWnd = CreateWindowEx( 0, className, windowName, style, CW_USEDEFAULT, CW_USEDEFAULT, width, height, NULL, NULL, hInst, NULL); if( m_hWnd == NULL ) return E_FAIL; // 自身をウィンドウハンドルにセットする SetWindowLong( m_hWnd, GWL_USERDATA, (LONG)this ); ShowWindow(m_hWnd, nCmdShow); UpdateWindow(m_hWnd); if( windowFlag ) m_bMain = true; return S_OK; } void C_BaseWnd::Uninit(void) { UnregisterClass(m_wndClassEx.lpszClassName, m_wndClassEx.hInstance); } LRESULT C_BaseWnd::LocalWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch( msg ) { case WM_CHAR: if( wParam == 0x61 ) { // サブウィンドウ初期化処理 C_BaseWnd *window2 = new C_BaseWnd(); window2->Init( (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), SW_SHOW, "Application Name2", "Window Name2", 1920, 1080, WS_OVERLAPPEDWINDOW, false ); } break; case WM_DESTROY: PostQuitMessage(0); break; default: break; } return DefWindowProc(hWnd, msg, wParam, lParam); } LRESULT C_BaseWnd::ChildWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch( msg ) { case WM_CHAR: break; case WM_CLOSE: break; default: break; } return DefWindowProc(hWnd, msg, wParam, lParam); } LRESULT CALLBACK C_BaseWnd::s_CallWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { // セットした個別のインスタンスを取得 C_BaseWnd *pInst = (C_BaseWnd *)GetWindowLong(hWnd, GWL_USERDATA); if( !pInst ) { return DefWindowProc(hWnd, msg, wParam, lParam); } if( pInst->m_bMain ) { return pInst->LocalWindProc(hWnd, msg, wParam, lParam); } else { return pInst->ChildWindProc(hWnd, msg, wParam, lParam); } }

  • 再起動時、前起動分のハンドルを得る方法は?

    WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS) { WNDCLASS wc; HWND hW; MSG ms; //ここで前起動クローンのアプリやWindowのハンドルを取得したい wc.lpszClassName ="goo"; wc.lpfnWndProc =(WNDPROC)WinProcedure; wc.hInstance =hI; wc.style =CS_HREDRAW|CS_VREDRAW; wc.cbClsExtra =NULL; wc.cbWndExtra =NULL; wc.hIcon =LoadIcon(NULL,IDI_EXCLAMATION); wc.hCursor =LoadCursor(NULL,IDC_ARROW); wc.hbrBackground =(HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName =NULL; RegisterClass(&wc); hW=CreateWindow ( "goo", "教えてgoo!", WS_OVERLAPPED|WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU, 0, 0, 640, 456, NULL, NULL, hI, NULL ); ShowWindow(hW,nCS); UpdateWindow(hW); while(GetMessage(&ms,NULL,NULL,NULL)) { TranslateMessage(&ms); DispatchMessage(&ms); } return (ms.wParam); } 上記アプリで//行で前起動時のWindowのハンドルを得るにはどうしたらいいのでしょうか?

  • adobe dream weaver CS4(CS5)で文字の色指定や

    adobe dream weaver CS4(CS5)で文字の色指定や、行の中央揃え(右揃え等)、テーブルのボーダー色の設定ができません。 今まで、マクロメディアのdream weaver 8を使用していたのですが、 この度、CS4を導入することになりまして、作業を行っていたところ、上記のように文字の色指定や行の中央揃え等の設定ができなくなってます。 調べたところ、CS3からCSSで設定するのが基本仕様っぽく、CSSの知識はあるのですが手軽にぱぱっとできないので困ってます。 また携帯サイトはスタイルシートが使えないので、文字の指定とかに、いちいちfontタグを打って入力しないといけないのでしょうか? バージョンがあがっているの不便になっているのかどうなのか…

  • マウスポインタの形状

    よろしくお願いします。 環境 WIN98 VC++6.0 MFC SDIにて http://www.net24.ne.jp/~kenji/s_swin/swin.htmlにあるウィンドウを生成した場合、 クライアント領域にあるマウスポインタの形が、エッジを触ってウィンドウの大きさを変える上下矢印や左右矢印に変わってしまうことがあります。 マウスポインタがクライアント領域にある時は、常に一般的な形(左上をさす白く太い形)にするにはどうすれば良いのですか? お分かりの方よろしくお願いいたします。 *********************** ウィンドウのスタイル LPCTSTR lpszClassName; CRect rect( 0, 0, 640, 480); HCURSOR hCursor = 0; DWORD dwStyle, dwExStyle; lpszClassName = AfxRegisterWndClass( CS_HREDRAW | CS_VREDRAW, hCursor); dwExStyle = WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE; dwStyle = WS_POPUP | WS_CAPTION | WS_VISIBLE | WS_SYSMENU | WS_BORDER | WS_THICKFRAME; CreateEx( dwExStyle, lpszClassName, _T("Test window"), dwStyle, rect, parent, NULL, NULL);

  • GetStockObject

    雑誌に載っているソースファイルの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow ) { WNDCLASS wc; MSG msg; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL , IDI_APPLICATION); wc.hCursor = LoadCursor(NULL , IDC_ARROW); ここ → wc.hbrBackground = GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = APP_NAME; ここのところでerror C2440: '=' : 'void *' から 'struct HBRUSH__ *' に変換することはできません。(新しい動作 ; ヘルプを参照) 'void*' から非 'void' 型への変換には明示的なキャストが必要です。とエラーがでてしまいます。なにぶん初心者なものでエラーの意味が分かりません。教えていただけたら嬉しいです。

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

    #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; } 子ウィンドウの作り方を理解したく、ただウィンドウを表示するプログラムを作ろうとしました。 しかし、うまくいきません。 一体なにがダメなんでしょうか?

  • 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); (以下略) }

  • C言語のwin32に関する質問(

    以下のコードは、ウィンドウを表示し、そのウィンドウを閉じるとアプリケーションが終わると言うプログラムなのですが、これを実行しウィンドウを閉じると、パソコンがビジー状態になってしまいます このプログラムをどう書き換えれば正常に動いてくれのでしょうか,解る方が居たら教えてください ↓がそのプログラムのソースです #include <windows.h> #include<stdlib.h> LRESULT CALLBACK WndProc(HWND window,UINT msg,WPARAM wpalam,LPARAM lpalam) { switch (msg){ case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(window,msg,wpalam,lpalam); }; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow){ HWND window; MSG uketori; WNDCLASS usuary; usuary.style=CS_HREDRAW|CS_VREDRAW; usuary.lpfnWndProc= WndProc; usuary.cbClsExtra=0; usuary.cbWndExtra=0; usuary.hInstance=hInstance; usuary.hIcon=LoadIcon(NULL,IDI_APPLICATION); usuary.hCursor=LoadCursor(NULL,IDC_ARROW); usuary.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); usuary.lpszMenuName=NULL; usuary.lpszClassName=TEXT("testtest"); RegisterClass(&usuary); window= CreateWindow(TEXT("testtest"),TEXT("testtest"),WS_OVERLAPPEDWINDOW|WS_VISIBLE,5,8,500,500,NULL,NULL,hInstance,NULL); while(GetMessage(&uketori,window,0,0)){ DispatchMessage(&uketorri) }; return uketori.wParam; };

  • イラストレーターCSが起動しません

    WindowsXPを使っています。 イラストレーターCSを起動させると 「指定した処理を実行できませんでした」 というエラーが出て起動できません。 もう1度起動させると、開く時もありますが、何回しても開かない時があります。 かと思いきや、1回目で開く時もあります。 パソコンを再起動しても1回はエラー表示で開かなかったり・・・と、意味が分かりません。 原因は何なのでしょうか? 他の質問者の回答を見ましたが、分からなかったので質問しました。 よろしくお願いします。