常用对话框

Common Dialogboxes Win32

本文关键字:对话框 常用      更新时间:2023-10-16

我有一个普通的颜色对话框,我想在菜单上按下激活。不幸的是,每次我按下这个项目,窗口就失去焦点,好像出现了一个对话框,但对话框从来没有出现过。

我现在使用的代码如下:

case ID_TOOL_CHOOSECOLOR:
//show colour dialog
ChooseColor(&cc);

我已经初始化了我的CHOOSECOLOR结构体,像这样

 cc.lStructSize    = sizeof (CHOOSECOLOR) ;
 cc.hwndOwner      = NULL ;
 cc.hInstance      = NULL ;
 cc.rgbResult      = RGB (0x80, 0x80, 0x80) ;
 cc.lpCustColors   = crCustColor ;
 cc.Flags          = CC_RGBINIT | CC_FULLOPEN ;
 cc.lCustData      = 0 ;
 cc.lpfnHook       = NULL ;
 cc.lpTemplateName = NULL ;

奇怪的是,这个对话框只有在我按下"ALT"键后才会出现(而且只有ALT键)。任何建议吗?

顺便说一下,我正试图在MDI文档中这样做。

谢谢

我能看到的唯一问题是您没有为对话框指定所有者。这可能导致在主窗口后面显示对话框。指定主窗口的句柄作为对话框的所有者。

在MSDN的窗口功能页面上阅读有关窗口所有权的更多信息。

修复!

原来,我的问题是在主窗口的WndProc。

我将WM_PAINT命令设置为return 0;而不是break;

改变我的return 0break解决了一切!我认为这是因为我的return将退出wndproc,而break将允许我继续到return MDIFrameProc(hwnd, message, wparam, lparam)

我可能错了,但这是我能想到的最好的解释,解释了为什么break有效,而return 0不行

绘制完成后,请确保调用ValidateRect(HWND,CONST RECT*);

// https://learn.microsoft.com/en-us/windows/win32/dlgbox/color-dialog-box
// http://winapi.freetechsecrets.com/win32/WIN32Choosing_a_Color.htm
COLORREF acrCustClr[16]; // array of custom colors
CHOOSECOLOR cc = {sizeof(cc)};
ZeroMemory(&cc, sizeof(CHOOSECOLOR));
cc.lStructSize = sizeof(CHOOSECOLOR);
cc.hwndOwner = hwnd;
cc.Flags = CC_FULLOPEN | CC_RGBINIT;
cc.lpCustColors = (LPDWORD) acrCustClr;
BOOL fOk = ChooseColor(&cc);
if (fOk) {
}