要控制多个对话进程?winapi / c++

multiple dialog processes to controls? winapi / C++

本文关键字:winapi c++ 进程 对话 控制      更新时间:2023-10-16

我刚刚基于这篇文章创建了多个编辑框(11x11控件):https://msdn.microsoft.com/en-us/library/windows/desktop/hh298433%28v=vs.85%29.aspx好吧,不完全相同,但我使用的代码在情况下WM_CREATE:块创建大量的控件。

我在父窗口上使用这个对话框进程:

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" ...

还要确保项目清单已经设置好,这样你就可以得到现代窗口的外观。

如果没有被注释掉,这将是一个错误:

case EN_CHANGE:
case WM_CTLCOLOREDIT: 

每个case应以break;return 0;结尾

此外,WM_CTLCOLOREDIT应该返回一个在堆上创建的刷。它不应该返回1。参见文档:

那部分还有其他错误,你应该删掉。