c++ - 多个对话过程来控制? winapi/C++

标签 c++ winapi win32-process

我刚刚根据这篇文章创建了多个编辑框(11x11 控件): https://msdn.microsoft.com/en-us/library/windows/desktop/hh298433%28v=vs.85%29.aspx 好吧,不完全一样,但我使用了 WM_CREATE: block 中的代码来创建大量控件。

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

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

还要确保项目 list 已设置,以便您获得现代窗口的外观。

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

case EN_CHANGE:
case WM_CTLCOLOREDIT: 

每个案例都应该以 break;return 0;

结束

此外,WM_CTLCOLOREDIT 应该返回在堆上创建的画笔。它不应返回 1。参见 documentation :

该部分还有其他错误,您应该将其删除。看这个example用于绘画。

关于c++ - 多个对话过程来控制? winapi/C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31280052/

相关文章:

winapi - 启动 CALC.EXE 并使用 VB6 检索值

c++ - 如何为 32 位位图生成单色位掩码

c - DeleteFile() 或 unlink() 调用成功但不删除文件

windows - 在 WIndows 上获取 64 位进程的 TEB

c++ - 使用 ReadProcessMemory 读取 std::map<string, string>

c++ - SIP over TCP + 转换为 UDP 以与 SIP 电话通话

c# - 从 C# 运行 C++ Qt 应用程序

c++ - 在 Linux 上断言失败后继续调试?

c++ - 删除复制的指针

java - 如何检查文件是否可读?