インターネットから収集したもので、参照のみを目的としています
実験 3 では 2 つの完全なレポートが収集されました。これは 2 つ目で、もう 1 つはこのコラムの前の記事にあります。
1 実験要件
· 全体的な目的: ウィンドウ間のメッセージ転送、コール スタックを理解する; カーソル、アイコン、メニューの作成と使用方法を習得する; メニューへの応答方法、ショートカット
メニューの読み込み方法と使用方法を習得する;
GetWindowLong/ の使用法を理解するSetWindowLong、GetClassLong/SetClassLong 関数。
・実験内容処理:
1. ChildWin サンプルプログラムを改良し、サブウィンドウにウィンドウ固有の情報(ウィンドウ ID 番号)を表示し、
各サブウィンドウに特定の色の四角形を描画してみる
ウィンドウプロシージャ内のリフレッシュ処理サブウィンドウの関数 メッセージに処理コードを追加
GetWindowLong関数を使用してサブウィンドウIDを取得 サブウィンドウIDに応じてサブウィンドウに表示する情報を設定(wsprintf関数を使用)
表示する
文字列を整理する)
サブウィンドウに特定の色を描画してみる 2.
メッセージ配信プロセスを追跡する
Childwin のメインウィンドウ処理関数の WM_CREATE、WM_PAINT、WM_COMMAND、WM_LBUTTONDOWN に
ブレークポイントを設定する
WM_CREATE、WM_PAINT に
ブレークポイントを設定する、WM_CHILDWIN、Childwin の WM_LBUTTONDOWN をクリックし
てプログラムを実行し、各ブレークポイントの応答プロセスを表示して、メッセージ配信の順序を理解します。
3. ソフト キーボードを設計して実装します。
サブウィンドウを使用してソフトキーボードを実現し(ウィンドウのクライアント領域にサブウィンドウで擬似的なキーボードを描画します)、
各サブウィンドウをマウスでクリックして異なる文字を入力します。入力した文字をウィンドウ内に表示します。4. コントロール テスト用に独自の作業ディレクトリに新しいプロジェクトを作成します (Easywin プロジェクトの easywin.cを新しいプロジェクトのディレクトリに
コピーし、ファイル名を ctltest.cpp に変更します (サフィックスを .cpp に変更します)。
プログラムをコンパイル、リンクし、
動作させる (コンパイル エラーの修正を含む)]。
5. * ボタンを使用して、4* で必要なソフト キーボードを完成させます。元の実装との違いを比較してください。
6. 静的、編集、リストボックス、コンボボックス、ボタン、スクロールバーなどのさまざまなタイプのコントロールサブウィンドウを作成し、
メインウィンドウのウィンドウプロシージャ関数に対応するメッセージ処理を追加して、メインウィンドウとメインウィンドウ間の通信を実現します。サブウィンドウ
(コントロールのタイトル/コンテンツを設定し、コントロールのタイトル/コンテンツを取得し、
コントロールにクリックなどの操作がある場合にメイン ウィンドウにプロンプトを表示してみます)。
7. 手順 5 と同様に、リソース テスト用の新しいプロジェクトを作成します。
8. 新しいリソース: カーソル、アイコンを追加し、正しく表示します
。 リソース エディターを使用してカーソル (色) を編集します。リソース内の不要なイメージ タイプを削除することに注意してください。そうしないと、
カーソルが正しく表示されない可能性があります。
カーソルのホットスポットを設定する
リソースエディタでアイコンを編集する
プログラムがカスタムカーソルとアイコンを正常に使用できるように、登録されたウィンドウクラスのコードを修正する
DrawIcon 関数を使用して、WM_PAINT メッセージに処理を追加する
カスタムオブジェクト指向プログラミング技術の実験レポートが
2 つの
カーソルとアイコン。
後続の実験手順のために別のカーソルを作成します。
9. メニューの追加
ウィンドウで使用されるカーソルを変更するメニュー項目コマンドをメニューに作成します。これには「ChangeCursor」という名前を付けることができ、対応する ID は ID_CHANGECURSOR であると想定されます
。
登録したウィンドウクラスのコードを変更し、プログラム実行時にメニューを正しくロードできるようにする
別の方法として、CreateWindow(CreateWindow)のコードを修正することで、メニューを正しくロードできるようにする
10. メニューメッセージの応答コードを増やす
WM_COMMAND のメッセージ処理
第 5 章メニューを参照 サンプルコードの処理メソッドはメニューコマンドに応答します
ID_CHANGECURSOR コマンドに対する応答は次のとおりです: ウィンドウで使用されるカーソルを変更するには、
SetClassLong (hwnd, GCL_HCURSOR,
(LONG) )LoadCursor((HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
MAKEINTRESOURCE(IDC_CURSOR2 ) ) );
11. マウスの右ボタンを処理し、ショートカット メニュー処理を追加
右ボタンによって発行されたメニュー コマンドは、WM_COMMAND メッセージを通じても応答されます。ショートカット メニューを追加した後、
プログラムはメイン メニューまたはショートカット メニューから同じコマンドを発行できるようになります。
12. プログラム構築に使用したバッチ ファイルに、この実験で完了したプロジェクトのコンパイルとリンクを追加し、使用します。バッチ ファイルを使用して、
実験 1、2、および 3 のすべてのプロジェクトを一度に自動的にビルドします。
2 実験の過程と結果
2.1 ChildWin サンプルプログラムを改良し、サブウィンドウにウィンドウ固有の情報(ウィンドウ ID 番号)を表示し、各サブウィンドウに特定の色の四角形を描画する
ようにしました 図のように ID 番号を表示し、緑色の長方形
2.2 メッセージングプロセスの追跡
1. ChildWin のメインウィンドウ処理関数の WM_CREATE、WM_PAINT、WM_COMMAND、WM_LBUTTONDOWN にブレークポイントを設定します。
·WM_CREATE:
ウィンドウ作成時にブレークする
WM_COMMAND:
子ウィンドウを押すとプログラムが割り込みを生成します
WM_LBUTTONDOWN:
マウスの左ボタンが押されるとプログラムが割り込みを生成します
2. 子ウィンドウ
WM_CREATE の WM_CREATE、WM_PAINT、WM_CHILDWIN、WM_LBUTTONDOWN にブレークポイントを設定します。
WM_PAINT:
メインウィンドウは通常どおり描画表示され、サブウィンドウの描画前に割り込みが発生します。プロセス単位の動作では、最初のサブウィンドウから開始して、WM_PAINT の周期で 1 つずつ描画表示します。
WM_CHILDWIN:
マウスがサブウィンドウに当たると、メイン ウィンドウは通知メッセージを受け取り、WM_CHILDWIN に通知メッセージを送信します。これにより割り込みが生成されます。 WM_LBUTTONDOWN: 3. プログラムを実行し、各ブレークポイント
の
応答プロセスを確認して、プログラムの順序を理解します。メッセージ配信:
ブレークポイントを設定し、対応するデバッグを実行した後、マウスの左ボタンがサブウィンドウに到達すると、サブウィンドウの WM_LBUTTONDOWN が応答を生成してメイン ウィンドウ WM_COMMAND にメッセージを送信し、WM_COMMAND がメッセージを送信することがわかります。 WM_CHILDWIN は、サブウィンドウがヒットしたことを確認した後、サブウィンドウにメッセージを送信します。WM_CHILDWIN は、メッセージを受信した後、子ウィンドウのヒットフラグを 0 に設定します。
2.3 ソフトキーボードを設計して実装し、マウスで各サブウィンドウをクリックしてさまざまな文字を入力し、入力された文字をウィンドウに表示します
2.4 コントロール テスト用の新しいプロジェクトを作成し、Easywin プロジェクトの easywin.c を新しいプロジェクトのディレクトリにコピーし、ファイル名を ctltest.cpp (サフィックスを .cpp に変更) に変更し、コンパイル、リンクして、プログラムは正常に動作します(コンパイルエラーの修正を含む)
2.5 *ボタンを使用して、4 で必要なソフト キーボードの実装を完了します*
2.6 各種制御サブウィンドウを作成し、メインウィンドウのウィンドウプロシージャ関数に対応するメッセージ処理を追加して、メインウィンドウとサブウィンドウ間の通信を実現します。
テスト用に EDIT、LISTBOX、BUTTON ウィンドウを作成します。
1. EDIT ウィンドウはテキスト入力を実装できます。 2.
LISTBOX ウィンドウは、行をクリックするとウィンドウをポップアップし、現在のオプション値を表示します。
3. BUTTON ウィンドウがポップアップします。マウスの左ボタンをクリックした後のウィンドウ プロンプト ボタンが押されました:
2.7 リソース テスト用の新しいプロジェクトを作成します
。 2.8 新しいリソースを追加します: カーソル、アイコン、および正しく表示します
。 1. リソース エディターを使用してカーソル (色) を編集します
。カーソルのホットスポット(ホットスポット)を設定します。
3. リソースエディタでアイコンを編集します。
4. プログラムがカスタム カーソルとアイコンを正常に使用できるように、登録されたウィンドウ クラスのコードを変更します。
5. DrawIcon 関数を使用して WM_PAINT メッセージに処理を追加し、ウィンドウのクライアント領域にカスタム カーソルとアイコンを表示します。
6. 後続の実験手順のために追加のカーソルを作成します。
2.9 メニューの追加
1. ウィンドウで使用されるカーソルを変更するメニュー項目コマンドをメニューに作成します。これには「ChangeCursor」という名前を付けることができ、対応する ID は ID_CHANGECURSOR であると想定されます。
2. プログラムの実行時にメニューが正しくロードされるように、登録されたウィンドウ クラスのコードを変更します。
3. 別の方法では、CreateWindow のコードを変更することで、メニューを正しくロードできます。
2.10 メニュー メッセージの応答コードを追加します。 WM_COMMAND メッセージ処理を追加します。ID_CHANGECURSOR コマンドに対する応答は次のようになります。
ウィンドウで使用される
カーソル メニュー コマンド ChangeCursor を変更します。 変更後:
2.11マウスの右ボタンを処理し、ショートカット メニューの処理を追加する 右ボタンで発行されたメニュー コマンドも、WM_COMMAND メッセージを通じて応答されます。ショートカット メニューを追加した後、プログラム
はメイン メニューまたはショートカット メニューから同じ
この実験では、プログラム構築に使用するバッチファイルに、完成したプロジェクトのコンパイルとリンクを追加し、実験1、2、3のすべてのプロジェクトをバッチファイルで一括自動ビルドします。
3 実験の概要
この実験は、これまでの 2 つの実験に比べて、自分で考えて探求する部分が加わった非常に難しい実験ですが、だからこそ、この実験から得たものは非常に大きかったです。 GetWindowLongなどの関数をより深く理解する
子ウィンドウの ID の抽出から四角形の描画までを理解し、関連関数の適用とブレークポイントのデバッグを通じて、メッセージ通知の接続とウィンドウ間の関連操作をより完全に理解する親ウィンドウと子ウィンドウ: 親ウィンドウと子ウィンドウの関係により、目的を簡潔かつ効果的に実現できます。
2. ソフトキーボードの設計と実装を通じて、子ウィンドウの選択と解放、およびそれに対応する親ウィンドウの操作についてさらに学びました。そして、ソフトキーボードを作成する過程で、サブウィンドウのレイアウトについてもさらに考え、自分自身の探索と実験の後、より美しいソフトキーボードを作成するために最善を尽くし、ある種の成果も得ました。一生懸命実験している最中です。振り返ってみると、ソフト キーボードの作成は複雑ではありませんが、以前はまだ無知なプロジェクトであり、ゼロからソフト キーボードを作成することは、コースで学び、知識を蓄積するプロセスでもありました。
3. 制御テスト部分は授業のプログラム例の延長であり、難しくはありませんが、主に各空間の構造、ウィンドウの書き方、応用方法などを学ぶ必要があります。望ましい効果。
4. リソーステストは上記と同様で、先生の丁寧な説明により、実験に必要な機能のほとんどは授業内で実現できます。授業後の私自身の実験では、主にプログラムを適用するなどの作業を行いました。資力。
5. 前の 2 つの部分と比較すると、メニュー部分でいくつかの困難に遭遇しました。授業中の教師の操作に従ってメニューの確立と参照が実現できなかったが、メニュー関数の実現部分では、実験によるとSetClassLong関数も数回の試行で実現できた。比較的時間がかかるのはショートカット メニューの作成と使用であり、独学で作成する必要があります。情報を参考に試行錯誤を続け、ようやくショートカットメニューのカーソル変更操作が完了しました。
6. 総じて、この実験は比較的成功しています。時間はかかりますが、ほとんどのプロジェクトは自分の努力で完了します。Windows プログラミングの知識がより深く理解できました。プロジェクトの実現により、私も自信を持てるようになります。」お金を払えば報酬が得られると感じます。しかし同時に、実験の進捗が遅かったため、プロジェクトとして選択したBUTTONソフトキーボードは実現できませんでした。次の実験では、もっと頑張って、時間内に実験を完了し、すべての実験タスクをうまくやり遂げます。 。
付録: キーコード
GetWindowLong 関数を使用して子ウィンドウ ID を取得します。
サブウィンドウIDに応じてサブウィンドウに表示する情報を設定します(wsprintf関数を使用して表示する文字列を整理します)
int number = GetWindowLong ( hWnd , GWL_ID ); //子ウィンドウ ID を取得します
文字列[20];
wsprintf (文字列, TEXT ( "%d" ), 数値);
WM_PAINTの場合:
DrawText (hdc, string, //サブウィンドウID番号を表示)
-1、&rect、DT_SINGLELINE | DT_センター| DT_VCENTER );
特定の色の長方形を描画します
HBRUSH hColorPen;
HGDIOBJ hGdiobj;
hColorPen = CreateSolidBrush( RGB (10, 100, 100)); //ブラシを作成し、色を選択します
hGdiobj = SelectObject(hdc, hColorPen); //選択範囲をブラシで描画します
長方形(hdc, 5, 20, 45, 45);
DeleteObject(hColorPen); //ブラシを放します
ソフト キーボードを設計して実装します。
#define ROW_NUM 4 //行数
#define COL_NUM 16 //列数
INT t = 0; //サブウィンドウの初回選択時に1になるグローバル変数tは、ソフトキーボードの初期状態での文字入力を回避するために使用されます
LRESULT CALLBACK MainWndProc( HWND hWnd , UINT メッセージ, WPARAM wParam , LPARAM lParam )
{
static HWND hChildWnd[ COL_NUM ][ ROW_NUM ]; //子ウィンドウ ハンドル
static int nXBox, nYBox; //サブウィンドウの幅と高さ
static WORD nChildWin_ID; //ヒットした子ウィンドウの ID
static int nRow, nCol; //ヒットしたサブウィンドウの位置 (行番号と列番号)
int x, y;
WNDCLASS wcChild; //子ウィンドウ クラス
スイッチ(メッセージ)
{
WM_CREATEの場合:
...
// 「描画」プログラムの描画ツールバーと同様の各ツールのサブウィンドウを作成します
for (y = 0; y < ROW_NUM; y++)
for (x = 0; x < COL_NUM; x++)
{
nChildWin_ID = y << 4 | x; //子ウィンドウ ID 値は y * 2^4 +4 と同等です
hChildWnd[x][y] = CreateWindow (szChildName, NULL ,
WS_CHILDWINDOW | WS_DLGFRAME | WS_VISIBLE 、
0、0、0、0、
hWnd 、
( HMENU )(nChildWin_ID), //子ウィンドウ ID 番号
//0、
hInst、NULL );
}
0を返します。
WM_SIZEの場合:
nXBox = ( LOWORD ( lParam )*4/5)/ COL_NUM ;
nYBox = ( HIWORD ( lParam )*2/5) / ROW_NUM ;
//メインウィンドウのサイズが変更された場合、メインウィンドウのクライアント領域内の各サブウィンドウの位置を再決定します
for (y = 0; y < ROW_NUM; y++)
for (x = 0; x < COL_NUM; x++)
{
MoveWindow(hChildWnd[x][y], (x * nXBox + LOWORD ( lParam )/10),
(y * nYBox + HIWORD ( lParam ) / 3), nXBox, nYBox, TRUE ); //xy幅と高さ
}
0を返します。
case WM_COMMAND : //子ウィンドウがヒットしたことを示す通知メッセージ
//サブウィンドウがヒットしたときにこのメッセージを送信してメイン ウィンドウに通知し、メイン ウィンドウが別のサブウィンドウがヒットしたかどうかを判断できるようにします。
//そうであれば、サブウィンドウ関数に、以前にヒットしたサブウィンドウの状態を変更するように通知するメッセージを送信します。
if (!( LOWORD ( wParam ) == nChildWin_ID))
{
SendMessage (( HWND )hChildWnd[nCol][nRow], WM_CHILDWIN , 0, 0L);
//新しいヒット子ウィンドウを記録します
nChildWin_ID = LOWORD ( wParam );
nCol = (nChildWin_ID > 15) ? (nChildWin_ID - 16) : nChildWin_ID;
nRow = nChildWin_ID >> 4;
}
InvalidateRect( hWnd , NULL , TRUE );
0を返します。
WM_PAINTの場合:
if (t)//子ウィンドウがヒットした後、対応する文字の描画と表示を開始します
{
HDC HDC;
ペイントストラクチャーps;
RECT 長方形;
LONG l = 0;
GetClientRect( hWnd , &rect);
hdc = BeginPaint( hWnd , &ps);
int数値 = nChildWin_ID;
静的 文字列[100] = { 0 };
静的 int n = 0;
文字列[n] = 数値 + 65;
n++;
DrawText (hdc, string, n, &rect, DT_SINGLELINE );
EndPaint( hWnd , &ps);
}
0を返します。
....
return DefWindowProc ( hWnd , message , wParam , lParam );
} //関数 WinProc が終了します
LRESULT CALLBACK ChildWndProc( HWND hWnd , UINT メッセージ, WPARAM wParam , LPARAM lParam )
{
...
WM_LBUTTONDOWNの場合:
//新しい子ウィンドウがヒットします
if ( GetWindowLong ( hWnd , 0) == 0)
{
t = 1;
//子ウィンドウのヒットフラグを 1 に設定します
SetWindowLong ( hWnd , 0, 1);
//メインウィンドウに通知するメッセージを送信します
SendMessage (GetParent( hWnd )、WM_COMMAND 、
//(WPARAM) MAKELONG ((WORD)GetWindowWord (hWnd, GWL_ID), (WORD)0),
GetWindowLong ( hWnd 、GWL_ID )、
( LPARAM ) hWnd );
//子ウィンドウのクライアント領域を再描画
GetClientRect( hWnd , &rect);
InvalidateRect( hWnd , &rect, TRUE );
}
0を返します。
case WM_CHILDWIN : //メイン ウィンドウによって送信された通知メッセージにより、元のヒット子ウィンドウの状態が変更されます
//子ウィンドウのヒットフラグを 0 に設定します。
SetWindowLong ( hWnd , 0, 0);
//子ウィンドウの表示モードを初期状態に戻す
GetClientRect( hWnd , &rect);
InvalidateRect( hWnd , &rect, TRUE );
0を返します。
WM_PAINTの場合:
hdc = BeginPaint( hWnd , &ps);
GetClientRect( hWnd , &rect);
Rectangle(hdc, 10, 10, 40, 40);//左高右底
for ( int j = 0; j < COL_NUM; j++)
for ( int i = 0; i < ROW_NUM; i++) //列数
{
char szBuff[50];
charキー = GetWindowLong ( hWnd , GWL_ID ) + 65;
wsprintf (szBuff, TEXT ( "%c" ), key); //サブウィンドウの文字を描画します
DrawText (hdc、szBuff、
-1、&rect、DT_SINGLELINE | DT_センター| DT_VCENTER );
}
EndPaint( hWnd , &ps);
0を返します。
WM_DESTROYの場合:
PostQuitMessage(0);
0を返します。
}
return DefWindowProc ( hWnd , message , wParam , lParam );
} //関数 ChildWinProc が終了します
各種制御サブウィンドウを作成し、メインウィンドウのウィンドウプロシージャ関数に対応するメッセージ処理を追加することで、メインウィンドウとサブウィンドウ間の通信を実現します。
#define ITEMCOUNT 5
WCHAR gListItems[ ITEMCOUNT ][60] = {
L"MSG メッセージ;" 、
L"if (!InitWindow (hInstance, iCmdShow))" ,
L"FALSE を返す;" 、
L"GetMessage (&msg, NULL, 0, 0)" ,
「わかりました」
};
LRESULT CALLBACK WinProc ( HWND hWnd 、UINT メッセージ、WPARAM wParam 、LPARAM lParam )
{
....
スイッチ(メッセージ)
{
case WM_CREATE : //メッセージを作成する
hWndEdit = CreateWindow ( TEXT ( "EDIT" ), // 編集
NULL , //タイトルなし
WS_CHILD | WS_VISIBLE | WS_HSCROLL | //コントロールのスタイルを編集します
WS_VSCROLL | WS_BORDER | ES_LEFT |
ES_MULTILINE | ES_AUTOHSCROLL |
IS_AUTOVSCROLL 、
0、0、0、0、
hWnd , //親ウィンドウハンドル
( HMENU )1, //編集コントロールのサブウィンドウID
( HINSTANCE ) GetWindowLong ( hWnd 、GWL_HINSTANCE )、
NULL );
hWndList = CreateWindow ( TEXT ( "LISTBOX" ), //LISTBOX NULL , //無題
WS_CHILD | WS_VISIBLE | LBS_STANDARD , //コントロールのスタイルを編集します
0、0、0、0、
hWnd , //親ウィンドウハンドル
( HMENU )2, //編集コントロールのサブウィンドウID
( HINSTANCE ) GetWindowLong ( hWnd 、GWL_HINSTANCE )、
NULL );
hWndButton = CreateWindow ( TEXT ( "BUTTON" ), //BUTTON
NULL , //タイトルなし
WS_CHILD | WS_VISIBLE | BS_プッシュボタン、
0、0、0、0、
hWnd , //親ウィンドウハンドル
( HMENU )3, //編集コントロールのサブウィンドウID
( HINSTANCE ) GetWindowLong ( hWnd 、GWL_HINSTANCE )、
NULL );
for ( int i = 0; i < ITEMCOUNT; i++)
{
SendMessage (hWndList, LB_ADDSTRING , 0, ( LPARAM )gListItems[i]);
}
0を返します。
WM_SIZEの場合:
MoveWindow(hWndEdit, 0, 0, LOWORD ( lParam ) / 3, HIWORD ( lParam ), TRUE );
MoveWindow(hWndList, LOWORD ( lParam ) / 3 + 2, 0, LOWORD ( lParam ) / 3 - 5, HIWORD ( lParam ), TRUE );
MoveWindow(hWndButton, 2* LOWORD ( lParam )/3+2 , 0, 2* LOWORD ( lParam )/3-5 , HIWORD ( lParam ), TRUE );
0を返します。
WM_COMMANDの場合:
WORD w、W1、W2、W3;
w = LOWORD ( wParam );
W1 = HIWORD ( wParam );
W2 = LOWORD ( lParam );
W3 = HIWORD ( lParam );
//コントロール通知メッセージを編集
if (( LOWORD ( wParam )) == 1)
{
}
else if (( LOWORD ( wParam )) == 2)
{
if ( HIWORD ( wParam ) == LBN_SELCHANGE )
{
WCHARメッセージ[32];
UINT u = SendMessage (( HWND ) lParam , LB_GETCURSEL , 0, 0);
wsprintf (msg, L"%d" , u);
MessageBox ( hWnd 、 msg 、L"SEL" 、MB_OK );
}
}
else if (( LOWORD ( wParam )) == 3)
{
MessageBox ( hWnd , TEXT ( "ボタンが押されました!" )、TEXT ( "ウィンドウ メッセージ" )、MB_OK );
}
0を返します。
WM_DESTROYの場合:
PostQuitMessage(0);
0を返します。
}
//デフォルトのメッセージハンドラーを呼び出します。
return DefWindowProc ( hWnd , message , wParam , lParam );
} //関数 WinProc が終了します
プログラムがカスタム カーソルとアイコンを通常どおり使用できるように、登録ウィンドウのクラス コードを変更します。
wcMainWnd.hIcon = LoadIcon ( hInstance , MAKEINTRESOURCE ( IDI_ICON1 ));//アイコン
wcMainWnd.hCursor = LoadCursor ( hInstance , MAKEINTRESOURCE ( IDC_CURSOR1 ));//光定
DrawIcon関数を使用してWM_PAINTメッセージに処理を追加し、ウィンドウのクライアント領域にカスタムカーソルとアイコンを表示します
HICON hIcon = LoadIcon (hInstance, MAKEINTRESOURCE ( IDI_ICON1 ));
HCURSOR hCursor = LoadCursor (hInstance, MAKEINTRESOURCE ( IDC_CURSOR1 ));
...
DrawIcon(hdc, 160, 80, hIcon);
DrawIcon(hdc, 100, 80, hCursor);
マウスの右ボタンの処理、ショートカットメニュー処理の追加
HMENU hSubMenu; //グローバル変数
static BOOL InitWindow( HINSTANCE hInstance , int iCmdShow )
{
...
HMENU hMenu = LoadMenu ( hInstance , MAKEINTRESOURCE ( IDR_MENU2 ));
hSubMenu = GetSubMenu(hMenu, 1);
……
}
LRESULT CALLBACK WinProc ( HWND hWnd 、UINT メッセージ、WPARAM wParam 、LPARAM lParam )
{
...
case WM_RBUTTONDOWN : //マウスメッセージ
GetCursorPos(&stPos); //カーソル位置を取得する
TrackPopupMenu(hSubMenu, TPM_LEFTALIGN , stPos.x, stPos.y, NULL , hWnd , NULL ); //指定した位置にショートカット メニューを表示します
0を返します。
...
}