/*
       フローティングメニュー

         2000/ 4/ 2  宍戸 輝光
*/

#include <windows.h>

HINSTANCE hInst;

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

HWND hwMain;

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
                    PSTR szCmdLine,int iCmdShow){

	MSG  msg;
	WNDCLASSEX wndclass;

	hInst=hInstance; /* プロセスのハンドルを保存 */

	wndclass.cbSize        = sizeof(wndclass);
	wndclass.style         = CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc   = WndProc;
	wndclass.cbClsExtra    = 0;
	wndclass.cbWndExtra    = 0;
	wndclass.hInstance     = hInstance;
	wndclass.hIcon         = LoadIcon(NULL,IDI_APPLICATION);
	wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
	wndclass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
	wndclass.lpszMenuName  = NULL;
	wndclass.lpszClassName = "CWindow";
	wndclass.hIconSm       = LoadIcon(NULL,IDI_APPLICATION);

	RegisterClassEx(&wndclass); /* ウインドウクラス登録 */

	hwMain = CreateWindow("CWindow","フローティングメニュー",
	  WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,400,320,
      NULL,NULL,hInstance,NULL);

	ShowWindow(hwMain,iCmdShow); /* ウインドウを表示 */
	UpdateWindow(hwMain);

	while (GetMessage(&msg,NULL,0,0)) { /* メッセージループ */

		TranslateMessage(&msg);
		DispatchMessage(&msg);

	}

	return msg.wParam ;

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) {

	static HMENU hMenu,hMenuP;
	POINT pt;

	switch (iMsg) {

		case WM_CREATE:

			hMenu=CreateMenu(); /* トップレベルメニュー */
			hMenuP=CreateMenu(); /* フローティングメニュー */

			/* フローティングメニュー作成 */
			AppendMenu(hMenuP,MF_STRING,1,"Message");
			AppendMenu(hMenuP,MF_STRING,2,"Exit");

			/* フローティングメニューをメニューに登録 */
			AppendMenu(hMenu,MF_POPUP,(UINT)hMenuP,NULL);

			return 0;

		case WM_RBUTTONDOWN:

			/* スクリーン上のマウスカーソル座標取得 */
			pt.x=LOWORD(lParam);
			pt.y=HIWORD(lParam);
			ClientToScreen(hwnd,&pt);

			/* カーソル位置にメニューを出す */
			TrackPopupMenu(hMenuP,0,pt.x,pt.y,0,hwnd,NULL);

			return 0;

		case WM_COMMAND:

			switch (LOWORD(wParam)) {

				case 1: /* Messageメニュー */

					MessageBox(hwnd,"Test","Test",MB_OK);

					break;

				case 2: /* Exitメニュー */

					DestroyWindow(hwMain);

					break;

			}

			return 0;

		case WM_DESTROY : /* 終了処理 */

			PostQuitMessage(0);

			return 0;

	}

	return DefWindowProc (hwnd, iMsg, wParam, lParam) ;

}