c++ - 将组合框添加到 win32 API

标签 c++ api winapi combobox

好吧,首先这是家庭作业,但我们的老师鼓励我们超越他实际给我们布置的作业。所以我想学习如何添加常用对话框。我选择使用组合框。

问题是..我完全不知道从哪里开始。我已经用谷歌搜索了它,并在没有帮助的情况下浏览了第一页半,所以我在这里发帖:)。任务是做一些简单的事情,例如显示我的名字并绘制一些省略号,现在我想添加一个组合框..

这是我的代码。

/*------------------------------------------------------------------------
Name: Jesse Moreland
Class: CST 238 GUI
Lab 2
---------------------------------------------------------------------------*/

#include <windows.h>
#include <WinUser.h>
#include <string>

using std::string;

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR lpszCmdParam, int nCmdShow)
     {
     static char szAppName[] = "ErrorSample";
     HWND           hwnd;
     HWND           comboBox;
     MSG            msg;    // Look how this struct is defined-see help/class notes NOW
     WNDCLASSEX     wndclass; 

          wndclass.cbSize        = sizeof(wndclass);
          wndclass.style         = CS_HREDRAW | CS_VREDRAW;
          wndclass.lpfnWndProc   = WndProc;
          wndclass.cbClsExtra    = 0;
          wndclass.cbWndExtra    = 0;
          wndclass.hInstance     = hInstance;
          wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION);

          wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW);
          wndclass.hbrBackground = static_cast<HBRUSH>(GetStockObject (WHITE_BRUSH));
          wndclass.lpszMenuName  = NULL;
          wndclass.lpszClassName = szAppName;
          wndclass.hIconSm       = LoadIcon(NULL, MAKEINTRESOURCE(IDI_ERROR));

          RegisterClassEx (&wndclass);

//        PlaySound("C:\\Windows\\winsxs\\x86_microsoft-windows-speech-userexperience_31bf3856ad364e35_6.1.7601.17514_none_1e1159f6aa0eb8c7\\Speech Off.wav",NULL, SND_FILENAME);

     hwnd = CreateWindow (szAppName,         // window class name
            "Jesse Moreland LAB 2 - Press Left or Right Mouse Button",           // window caption
                    WS_OVERLAPPEDWINDOW,     // window style
                    CW_USEDEFAULT,           // initial x position
                    CW_USEDEFAULT,           // initial y position
                    CW_USEDEFAULT,           // initial x size
                    CW_USEDEFAULT,           // initial y size
                    NULL,                    // parent window handle
                    NULL,                    // window menu handle
                    hInstance,               // program instance handle
                    NULL);                   // creation parameters

     ShowWindow (hwnd, nCmdShow);

     UpdateWindow (hwnd);

     while (GetMessage (&msg, NULL, 0, 0))
          {
          TranslateMessage (&msg);
          DispatchMessage (&msg);
          }
     return (int) msg.wParam;
     }

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, 
                          WPARAM wParam, LPARAM lParam)
     {
     HDC  hdc;
     PAINTSTRUCT ps;
     RECT        rect;
     RECT        size;

     char * summer = "SUMMER IS COMING SOON!";
     char * leftOrRight = "Press Left or Right Mouse Button to make selection";

     switch (message)
         {

          case WM_PAINT:
                hdc = BeginPaint (hwnd, &ps);

                GetClientRect (hwnd, &rect);

                GetWindowRect(hwnd, &size);

                HPEN hPenOld;

                //Draw ellipse
                HPEN hEllipsePen;
                COLORREF qEllipseColor;

                qEllipseColor = RGB(0, 0, 255);
                hEllipsePen = CreatePen(PS_SOLID, 3, qEllipseColor);
                hPenOld =(HPEN)SelectObject(hdc, hEllipsePen);

                Arc(hdc, 40, 40, 160, 80, 0, 0, 0, 0);
                Arc(hdc, 50, 50, 180, 60, 0, 0, 0, 0);

                SelectObject(hdc, hPenOld);
                DeleteObject(hEllipsePen);

                TextOut(hdc, 0, 0, summer, strlen(summer));
                TextOut(hdc, 0, 20, leftOrRight, strlen(leftOrRight));



                EndPaint (hwnd, &ps);
                return 0;

          case WM_LBUTTONDOWN:
              return 0;

          case WM_RBUTTONDOWN:
              return 0;

          case WM_DESTROY:
              PostQuitMessage(0);
              return 0;

         }

     return DefWindowProc (hwnd, message, wParam, lParam);
     }

我应该在哪里放置创建组合框的命令?

最佳答案

为 WM_CREATE 创建一个处理程序,例如

CASE WM_CREATE:
    CreateWindowEx(WS_EX_STATICEDGE, "COMBOBOX", "MyCombo1", 
            CBS_DROPDOWN | WS_CHILD | WS_VISIBLE, 
            0, 0, 50, 20, hwnd, 100, hInstance, NULL); // 100 = ID of this control
    CreateWindowEx(WS_EX_STATICEDGE, "COMBOBOX", "MyCombo2", 
            CBS_DROPDOWN | WS_CHILD | WS_VISIBLE, 
            100, 100, 50, 20, hwnd, 101, hInstance, NULL); // 101 = ID of this control
    return 0;

您可以在 dlgproc 中的其他位置检索窗口句柄

hEditCombo1 = GetDlgItem(hwnd, 100);

关于c++ - 将组合框添加到 win32 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15985366/

相关文章:

api - GitHub GraphQL API v4 与 REST API v3

php - 安全的 API 连接

C++:具有硬编码派生类的 ADT 基类与从文件输入构建的包罗万象的类

c++ - C++ vs C源代码的编译和执行时间

c++ - 如何在 `C++17` 中调用重载对齐的 new 和 delete 运算符?

python - API:为什么 Python 数组没有排序方法?

c++ - 容器如何处理 lambda 表达式的参数

c++ - 获取windows桌面路径

delphi - 如何从 32 bpp 的 TBitmap 实例创建 alpha 混合图标/光标(间接),而不创建临时 DIB 部分?

java - 如何使用 JNI 获取浏览器上当前 Activity 选项卡的进程 ID