質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1322閲覧

Win32APIのCS_VREDRAW,CS_HREDRAWの動きがわからない

fue

総合スコア4

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/02/06 11:04

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}

イメージ説明
ウィンドウタイトルの表示量からも分かる通りウィンドウを横に伸ばしたのに位置が変わっていない

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KOZ6.0

2022/02/06 12:12

TextOut(hdc, 5, 5, ... ってやってるので位置は変わらないのでは?
guest

回答2

0

CS_VREDRAWCS_HREDRAW の効果ですが、ご質問に書かれているように再描画するか否かだったと思います。
Visual C++ の付属ツールにspy++.exe というツールが入っていますので、こちらで、どのような Windows メッセージが発行されているか確認することが可能です。
リサイズ時に「WM_PAINT メッセージが発行されていないこと」を確認してみて下さい。

■ 方法: Spy++ の起動
https://docs.microsoft.com/ja-jp/visualstudio/debugger/how-to-start-spy-increment?view=vs-2022

ツールの場所:<Visual Studio インストールフォルダ>\Common7\Tools\spy++.exe

■ Spy++ の使い方

1.[スパイ] - [メッセージログの出力] を選択

イメージ説明

2.「ウィンドウ オプション」ダイアログにて、「ファインダー ツール」を用いて、対象のウィンドウを選択。

イメージ説明

3.「メッセージ」タブで出力対象の Windows メッセージを選択

大量に Windows メッセージが出力される為、一旦「すべてをクリア」をした後、キャプチャしたいメッセージを選ぶと良いかと思います。

イメージ説明

投稿2022/02/06 13:43

cx20

総合スコア4633

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fue

2022/02/11 06:38

ありがとうございます
guest

0

ベストアンサー

ウインドウを拡大したときは、WM_PAINT メッセージが発生します。
このとき、描画する領域は、拡大した領域のみだったと思います。
が、縮小したときは、必ずしも描画が必要ではないのでメッセージは発生しません。

CS_VREDRAW,CS_HREDRAW をつけると、拡大、縮小時に WM_PAINT が発生します。
このときの描画エリアはクライアント領域全体になります。

画像を拡大/縮小してウインドウ全体に張り付けているような場合(サイズによって内容が変わる)に効果が出ます。

投稿2022/02/06 13:11

編集2022/02/06 13:20
KOZ6.0

総合スコア2626

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fue

2022/02/06 13:37

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問