Windows API 32のウィンドウクラスのstyleに設定する値、CS_VREDRAW,CS_HREDRAWについての質問です。
5つくらいのサイトでこれに関しての説明を見たら大体、ウィンドウのリサイズ時に再描画するかしないかと書いてありました。そこで、TCHAR型の文字列を描画して、styleの値を0(NULLも試した)にして実行して、ウィンドウのリサイズをしてみました。しかし、見た様子ではしっかり文字列はウィンドウの端にくっついています。この2つの値はどんなことを意味しているんですか?
C++
1// ************************************ 2// Ex キーボードのイベント処理を行う 3// ************************************ 4//必要なヘッダーファイルのインクルード 5#define STRICT 6 7#include <windows.h> 8#include <stdlib.h> 9#include <string.h> 10#include <tchar.h> 11 12// シンボル定義及びマクロ 13#define WINDOW_WIDTH 800 14#define WINDOW_HEIGHT 600 15 16//文字列描画用配列 17TCHAR szstr[256] = _T("キーを押していません"); 18 19//ポイント構造体 20POINT pt = { 400, 200 }; 21 22// インスタンス(グローバル変数) 23HINSTANCE hInst; 24 25// ウィンドウプロシージャのコールバック関数 26LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 27 28int WINAPI WinMain(HINSTANCE hInstance, 29 HINSTANCE hPrevInstance, 30 LPSTR lpCmdLine, 31 int nCmdShow) 32{ 33 static TCHAR szWindowClass[] = _T("Sample04"); 34 static TCHAR szTitle[] = _T("キーボードのイベントを処理するプログラム"); 35 36 WNDCLASSEX wcex; 37 38 wcex.cbSize = sizeof(WNDCLASSEX); 39 wcex.style = 0; 40 wcex.lpfnWndProc = WndProc; 41 wcex.cbClsExtra = 0; 42 wcex.cbWndExtra = 0; 43 wcex.hInstance = hInstance; 44 wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); 45 wcex.hCursor = LoadCursor(NULL, IDC_WAIT); 46 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 47 wcex.lpszMenuName = NULL; 48 wcex.lpszClassName = szWindowClass; 49 wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); 50 51 if (!RegisterClassEx(&wcex)) 52 { 53 MessageBox(NULL, 54 _T("RegisterClassExの処理に失敗しました"), 55 _T("Sample04"), 56 NULL); 57 58 return 1; 59 } 60 61 hInst = hInstance; // グローバル変数に値を入れる 62 63 // The parameters to CreateWindow explained: 64 // szWindowClass : アプリケーションの名前 65 // szTitle : タイトルバーに現れる文字列 66 // WS_OVERLAPPEDWINDOW : 生成するウィンドウのタイプ 67 // CW_USEDEFAULT, CW_USEDEFAULT : 最初に置くポジション (x, y) 68 // WINDOW_WIDTH, WINDOW_HEIGHT : 最初のサイズ (幅, 高さ) 69 // NULL : このウィンドウの親ウィンドウのハンドル 70 // NULL : メニューバー(このサンプルでは使用せず) 71 // hInstance : WinMain関数の最初のパラメータ 72 // NULL : WM_CREATE情報(このアプリケーションでは使用せず) 73 HWND hWnd = CreateWindow( 74 szWindowClass, 75 szTitle, 76 WS_OVERLAPPEDWINDOW, 77 CW_USEDEFAULT, CW_USEDEFAULT, 78 WINDOW_WIDTH, WINDOW_HEIGHT, 79 NULL, 80 NULL, 81 hInstance, 82 NULL 83 ); 84 // ウィンドウが生成できなかった場合 85 if (!hWnd) 86 { 87 MessageBox(NULL, 88 _T("ウィンドウ生成に失敗しました!"), 89 _T("Sample04"), 90 NULL); 91 return 1; 92 } 93 94 // ウィンドウの表示に必要なパラメータ: 95 // hWnd : CreateWindowの戻り値 96 // nCmdShow : WinMainの引数の4番目 97 ShowWindow(hWnd, 98 nCmdShow); 99 UpdateWindow(hWnd); 100 101 // メインのメッセージループ: 102 MSG msg; 103 while (GetMessage(&msg, NULL, 0, 0)) 104 { 105 TranslateMessage(&msg); 106 DispatchMessage(&msg); 107 } 108 return (int)msg.wParam; 109} 110 111// ウィンドウプロシージャ(メッセージに対するコールバック関数) 112LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 113{ 114 PAINTSTRUCT ps; 115 HDC hdc; 116 switch (message) 117 { 118 case WM_PAINT: 119 // 描画処理の開始 120 hdc = BeginPaint(hWnd, &ps); 121 // 文字列の出力。 122 TextOut(hdc, 123 5, 5, 124 szstr, _tcslen(szstr)); 125 // ペイント処理の終了 126 EndPaint(hWnd, &ps); 127 break; 128 //キーを押した 129 case WM_KEYDOWN: 130 switch (wParam) 131 { 132 // エスケープキーの場合 133 case VK_ESCAPE: 134 //終了メッセージを発生させる 135 PostMessage(hWnd, WM_CLOSE, 0, 0); 136 break; 137 // スペースキーの場合 138 case VK_SPACE: 139 _stprintf_s(szstr, _T("%s"), _T("スペースキーを押しました")); 140 break; 141 // Aキーの場合 142 case 'A': 143 _stprintf_s(szstr, _T("%s"), _T("Aキーを押しました")); 144 break; 145 // Bキーの場合 146 case 0x42: 147 _stprintf_s(szstr, _T("%s"), _T("Bキーを押しました")); 148 break; 149 default: 150 _stprintf_s(szstr, _T("%s"), _T("キーを押しました")); 151 break; 152 } 153 //再描画メッセージを発生させる 154 InvalidateRect(hWnd, NULL, TRUE); 155 return 0; 156 //キーを放した 157 case WM_KEYUP: 158 _stprintf_s(szstr, _T("%s"), _T("キーを押していません")); 159 //再描画メッセージを発生させる 160 InvalidateRect(hWnd, NULL, TRUE); 161 return 0; 162 case WM_DESTROY: 163 PostQuitMessage(0); 164 break; 165 default: 166 return DefWindowProc(hWnd, message, wParam, lParam); 167 break; 168 } 169 170 return 0; 171}
回答2件
あなたの回答
tips
プレビュー