> 1つ目は、ウィンドウ内を右クリックするとコンテキストメニューを表示する機構
一般的なソフトのウィンドウの上部に存在するメニューと同じような処理で実装できるようです
有名なウェブサイト『猫でもわかるプログラミング』に解説がありましたので、よろしければご覧になってみてください
( 因みにDXライブラリには右クリックで表示するメニュー用の機能は無いので、こちらも Win32API を使用して
自前で実装していただく必要があります m(_ _;m )
<猫でもわかるプログラミング Windows SDK編 第1部 第44章 右クリックで出てくるメニュー>
http://www.kumei.ne.jp/c_lang/sdk/sdk_44.htm
ただ、書いてあることを理解するには Win32API の基礎的な知識が必要です
その Win32API の基礎的なことについても『猫でもわかるプログラミング』で解説されていますので、
必要に応じて44章以前の章を参照してください
<猫でもわかるプログラミング>
http://www.kumei.ne.jp/c_lang/
尚、DXライブラリで自前で作成したウインドウを使用する場合は SetUserWindow を使用します
// DXライブラリで使用するウインドウのハンドルをセットする( DxLib_Init を実行する以前でのみ有効 )
int SetUserWindow( HWND WindowHandle ) ;
『猫でもわかるプログラミング』のサンプルプログラムを元に SetUserWindow を使用して自前で用意した
ウインドウを使用するプログラムを組んでみましたので、よろしければご覧ください m(_ _)m
#include "DxLib.h"
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ) ;
char szClassNme[] = "ウィンドウクラス・ネーム";
int QuitMessageFlag = FALSE ;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, LPSTR lpszCmdLine, int nCmdShow)
{
// ウインドウの作成
HWND hWnd;
MSG msg;
WNDCLASS myProg;
if (!hPreInst) {
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 =(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);
// 作成したウインドウをセット
SetUserWindow( hWnd );
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
SetDrawScreen( DX_SCREEN_BACK ) ;
// メッセージループ
while( ProcessMessage() == 0 && QuitMessageFlag == FALSE )
{
// メッセージがあったら処理する
if( PeekMessage( &msg, hWnd, 0, 0, PM_REMOVE ) )
{
TranslateMessage( &msg ) ;
DispatchMessage( &msg ) ;
}
// ウインドウに四角形を描画する
ClearDrawScreen() ;
DrawBox( 100, 100, 200, 200, GetColor( 255,255,255 ), TRUE ) ;
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End();
return (msg.wParam);
}
// メッセージ処理用関数
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg) {
case WM_DESTROY:
QuitMessageFlag = TRUE ;
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd, msg, wParam, lParam));
}
return (0L);
}
> 2つ目は、タスクトレイにアイコンを追加、それを右クリックしてコンテキストメニューを表示、その中から設定や終了を選択する機構
こちらも『猫でもわかるプログラミング』に解説がありました
<猫でもわかるプログラミング Windows SDK編 第3部 第254章 タスクトレーに格納する>
http://www.kumei.ne.jp/c_lang/sdk3/sdk_254.htm
> 2つ目については見えないウィンドウを作成し自前のメッセージ処理の中で処理をすればいいのかと思ったのですが、Win32APIを大して叩いた覚えがないのでこれであってるのかわからず、質問させて頂いた次第です。
『猫でもわかるプログラミング』の解説でも
「タスクトレーに格納といっても、 実際はタスクトレーにアイコンを表示して、ウィンドウを見えなくしているだけです。
こうすることによってユーザーはウィンドウが小さくなって、タスクトレーに格納されたような 錯覚に陥ります。」
と解説されていますので、108EAA0Aさんの考えている方法で問題ないと思います