多个对话过程来控制? winapi / C++
multiple dialog processes to controls? winapi / C++
我刚刚根据这篇文章创建了多个编辑框(11x11 控件):
https://msdn.microsoft.com/en-us/library/windows/desktop/hh298433%28v=vs.85%29.aspx
好吧,不完全一样,但我使用代码以防 WM_CREATE: 块来创建大量控件。
我在父级上使用这个对话过程 window:
INT_PTR CALLBACK StartupDialogProc(HWND dialog, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg){
case WM_INITDIALOG:
Init_Startup(dialog);
return 1;
/*
case EN_CHANGE:
case WM_CTLCOLOREDIT:
{
HDC hdC = (HDC)wParam;
COLORREF crColorBackground = RGB(255,0,0);
if (crColorBackground)
SetBkColor(hdC, crColorBackground);
SetTextColor( hdC, RGB(12,112,212) );
SetBkMode( hdC, TRANSPARENT );
RECT rect;
GetClientRect( (HWND)lParam, &rect );
HBRUSH hBrush = CreateSolidBrush( RGB(209,209,209) );
//FrameRect( hdC, &rect, hBrush );
Rectangle( hdC, (int)rect.left, (int)rect.top, (int)rect.right, (int)rect.bottom );
DeleteObject( hBrush );
LOGBRUSH lb;
lb.lbStyle = BS_SOLID;
lb.lbColor = RGB(249,249,249);
lb.lbHatch = 0;
CreateBrushIndirect(&lb); // LRESULT
// GetStockObject(NULL_BRUSH);
return 1;
}
break;
*/
case WM_DESTROY:
setts.options.page = GetDlgItemInt(dialog, IDC_O_STARTUP_PAGE, NULL, FALSE);
setts.options.recent = GetDlgItemInt(dialog, IDC_O_STARTUP_RECENT, NULL, FALSE);
break;
case WM_CLOSE:
EndDialog(dialog, FALSE);
break;
case WM_COMMAND:
if (wParam == IDOK) {
EndDialog(dialog, TRUE);
return 0;
}
}
return 0;
}
有几件事我不清楚:
1) 如果我想将所有编辑控件的边框颜色从 id 5001 更改为 id 5121,该怎么做?对我来说,注释代码不起作用(什么时候取消注释)。看起来我把它放错了地方。
2) 如何正确地为所有控件创建对话进程?因为数字很大而且可能高几倍,我是否应该只调用一个从 5001 到 id 5121 的循环并调用函数:
INT_PTR CALLBACK EditDlgProc(HWND dialog, UINT msg, WPARAM wParam, LPARAM lParam) - 这是行不通的,因为每个函数都需要有不同的名称。
要更改编辑控件的边框颜色,您必须继承编辑控件并覆盖 WM_NCPAINT
。这有点高级,你真的不需要它。您可以只使用 WS_EX_CLIENTEDGE
标志:
CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT" ...
还要确保项目清单已设置,这样您就可以获得现代 window 的外观。
如果没有被注释掉,这将是一个错误:
case EN_CHANGE:
case WM_CTLCOLOREDIT:
每个案例应以 break;
或 return 0;
结尾
此外,WM_CTLCOLOREDIT
应该return 一个在堆上创建的画笔。它不应该 return 1. 参见 documentation :
该部分还有其他错误,您应该删除它。看这个example画画
我刚刚根据这篇文章创建了多个编辑框(11x11 控件): https://msdn.microsoft.com/en-us/library/windows/desktop/hh298433%28v=vs.85%29.aspx 好吧,不完全一样,但我使用代码以防 WM_CREATE: 块来创建大量控件。
我在父级上使用这个对话过程 window:
INT_PTR CALLBACK StartupDialogProc(HWND dialog, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg){
case WM_INITDIALOG:
Init_Startup(dialog);
return 1;
/*
case EN_CHANGE:
case WM_CTLCOLOREDIT:
{
HDC hdC = (HDC)wParam;
COLORREF crColorBackground = RGB(255,0,0);
if (crColorBackground)
SetBkColor(hdC, crColorBackground);
SetTextColor( hdC, RGB(12,112,212) );
SetBkMode( hdC, TRANSPARENT );
RECT rect;
GetClientRect( (HWND)lParam, &rect );
HBRUSH hBrush = CreateSolidBrush( RGB(209,209,209) );
//FrameRect( hdC, &rect, hBrush );
Rectangle( hdC, (int)rect.left, (int)rect.top, (int)rect.right, (int)rect.bottom );
DeleteObject( hBrush );
LOGBRUSH lb;
lb.lbStyle = BS_SOLID;
lb.lbColor = RGB(249,249,249);
lb.lbHatch = 0;
CreateBrushIndirect(&lb); // LRESULT
// GetStockObject(NULL_BRUSH);
return 1;
}
break;
*/
case WM_DESTROY:
setts.options.page = GetDlgItemInt(dialog, IDC_O_STARTUP_PAGE, NULL, FALSE);
setts.options.recent = GetDlgItemInt(dialog, IDC_O_STARTUP_RECENT, NULL, FALSE);
break;
case WM_CLOSE:
EndDialog(dialog, FALSE);
break;
case WM_COMMAND:
if (wParam == IDOK) {
EndDialog(dialog, TRUE);
return 0;
}
}
return 0;
}
有几件事我不清楚: 1) 如果我想将所有编辑控件的边框颜色从 id 5001 更改为 id 5121,该怎么做?对我来说,注释代码不起作用(什么时候取消注释)。看起来我把它放错了地方。 2) 如何正确地为所有控件创建对话进程?因为数字很大而且可能高几倍,我是否应该只调用一个从 5001 到 id 5121 的循环并调用函数: INT_PTR CALLBACK EditDlgProc(HWND dialog, UINT msg, WPARAM wParam, LPARAM lParam) - 这是行不通的,因为每个函数都需要有不同的名称。
要更改编辑控件的边框颜色,您必须继承编辑控件并覆盖 WM_NCPAINT
。这有点高级,你真的不需要它。您可以只使用 WS_EX_CLIENTEDGE
标志:
CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT" ...
还要确保项目清单已设置,这样您就可以获得现代 window 的外观。
如果没有被注释掉,这将是一个错误:
case EN_CHANGE:
case WM_CTLCOLOREDIT:
每个案例应以 break;
或 return 0;
此外,WM_CTLCOLOREDIT
应该return 一个在堆上创建的画笔。它不应该 return 1. 参见 documentation :
该部分还有其他错误,您应该删除它。看这个example画画