测试demo:#include <windows.h>HWND hWindow;HMENU hMenu;LRESULT CALLBACK MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) {
switch( msg) {
case WM_CLOSE:
::DestroyWindow(hWnd);
break;
case WM_RBUTTONUP:
{ hMenu=CreateMenu(); MENUITEMINFO mi; mi.cbSize = sizeof(MENUITEMINFO);
mi.fMask = MIIM_TYPE | MIIM_STRING;
mi.fType = MFT_STRING;
mi.dwTypeData = (char*)"aaaaa";
//这里经过了查阅msdn,数小时的google,试用了各种参数组合方法,最好的情况就是显示一个很窄的popup menu
::AppendMenu(hMenu, MF_STRING, (int)mi.dwTypeData, mi.dwTypeData); POINT pt;
::GetCursorPos(&pt);
::TrackPopupMenu(hMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hWnd, NULL);
}
break;
case WM_DESTROY:
::PostQuitMessage(0);
break;
} return(::DefWindowProc(hWnd, msg, wParam, lParam));
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { WNDCLASSEX wndClass; wndClass.lpszClassName = "Test01";
wndClass.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC;
wndClass.hInstance = hInstance;
wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wndClass.hCursor = LoadCursor(NULL, IDC_CROSS);
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.lpszMenuName = NULL;
wndClass.hIcon = NULL;
wndClass.hIconSm = NULL;
wndClass.lpfnWndProc = MainProc;
wndClass.cbSize = sizeof(WNDCLASSEX);
RegisterClassEx(&wndClass); hWindow = CreateWindowEx( WS_EX_TOPMOST, "Test01", "Test01",
WS_OVERLAPPEDWINDOW,
200, 200,300,300, NULL, NULL, hInstance, NULL);
ShowWindow(hWindow, true);
UpdateWindow(hWindow); MSG msg;
while(::GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} return 0;
}问题1: 以上程序是一个白色窗口,右键点击时候会弹出popup menu,但menu为什么很窄,这是为啥?
问题2: TrackPopupMenu函数需要一个Owner hwnd(倒数第2个参数),这是为什么,有什么办法让弹出menu不需要owner hwnd?
switch( msg) {
case WM_CLOSE:
::DestroyWindow(hWnd);
break;
case WM_RBUTTONUP:
{ hMenu=CreateMenu(); MENUITEMINFO mi; mi.cbSize = sizeof(MENUITEMINFO);
mi.fMask = MIIM_TYPE | MIIM_STRING;
mi.fType = MFT_STRING;
mi.dwTypeData = (char*)"aaaaa";
//这里经过了查阅msdn,数小时的google,试用了各种参数组合方法,最好的情况就是显示一个很窄的popup menu
::AppendMenu(hMenu, MF_STRING, (int)mi.dwTypeData, mi.dwTypeData); POINT pt;
::GetCursorPos(&pt);
::TrackPopupMenu(hMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hWnd, NULL);
}
break;
case WM_DESTROY:
::PostQuitMessage(0);
break;
} return(::DefWindowProc(hWnd, msg, wParam, lParam));
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { WNDCLASSEX wndClass; wndClass.lpszClassName = "Test01";
wndClass.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC;
wndClass.hInstance = hInstance;
wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wndClass.hCursor = LoadCursor(NULL, IDC_CROSS);
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.lpszMenuName = NULL;
wndClass.hIcon = NULL;
wndClass.hIconSm = NULL;
wndClass.lpfnWndProc = MainProc;
wndClass.cbSize = sizeof(WNDCLASSEX);
RegisterClassEx(&wndClass); hWindow = CreateWindowEx( WS_EX_TOPMOST, "Test01", "Test01",
WS_OVERLAPPEDWINDOW,
200, 200,300,300, NULL, NULL, hInstance, NULL);
ShowWindow(hWindow, true);
UpdateWindow(hWindow); MSG msg;
while(::GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} return 0;
}问题1: 以上程序是一个白色窗口,右键点击时候会弹出popup menu,但menu为什么很窄,这是为啥?
问题2: TrackPopupMenu函数需要一个Owner hwnd(倒数第2个参数),这是为什么,有什么办法让弹出menu不需要owner hwnd?
解决方案 »
- 如何让程序启动时,光标停在哪一个Textbox上
- 怎样实现树状下拉列表?
- 请问下,我的程序在debug下正常,在release下不正常,这是怎么回事?谢谢回答
- 如何求取每个点的颜色
- 求救. 我测试一个ftp的程序.在一台机器上开三十个客户端下载文件.出现莫名奇妙的错误.
- 请教高手: 如何将vc INT64(超过32位)类型的整数转化为十六进制字符串?
- 哪位大哥能用几段简单的代码说明一下阻塞和非阻塞的区别?
- 有谁知道浪漫的方法吗?怎样才能有情调?
- 上QQ发送信息的时候,自动弹出一些不要的信息(比如说黄色网站地址啊)并且自动发送出去,请问这是什么病毒
- 如何在.sys中返回一个地址给.exe?
- 求虚拟打印机思路或相关资料
- 临界区问题 求解
2.如果没有owner hwnd的话,那你的菜单的命令就处理不了了
那第2条看来没办法了,对于第1条标题"aaaaa"是够长了,但貌似没正确放进去
-->
hMenu=CreatePopupMenu();