ForeverGreenDam 2024-07-23 19:28 采纳率: 100%
浏览 2
已结题

Windows程序设计使用CreatewWindow创建按钮不显示

#include<windows.h>
#define NUM 5
#define GROUPBOX NUM+1
#define PUSHBUTTON1 NUM+2
#define PUSHBUTTON2 NUM+3
#define PUSHBUTTON3 NUM+4

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {

    static TCHAR szAppName[] = TEXT("翻牌子");
    HWND hwnd=0;
    MSG msg;
    WNDCLASS 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 = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;


    if (!RegisterClass(&wndclass))
    {
        MessageBox(hwnd, TEXT("抱歉,本程序需要在Windows NT上运行!"), szAppName, MB_ICONERROR);
        return 0;
    }
    hwnd = CreateWindow(szAppName, TEXT("赛博选妃"),
        WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU,
        CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL, hInstance, NULL);
    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);

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

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hwndButton[NUM];
    static RECT rect;
     const TCHAR* Name[] = { TEXT("王昭君"),TEXT("貂蝉"),TEXT("西施"),TEXT("杨玉环"),TEXT("AAA") };
    static int cxChar, cyChar;
    HDC hdc;
    PAINTSTRUCT ps;
    int i;


    switch (message)
    {
    case WM_CREATE:
        cxChar = LOWORD(GetDialogBaseUnits());
        cyChar = HIWORD(GetDialogBaseUnits());
        GetWindowRect(hwnd, &rect);
        MoveWindow(hwnd, rect.left, rect.top, 27 * cxChar, 13 * cyChar, TRUE);
        for ( i = 0; i < NUM-1; i++)
        {
            hwndButton[i]= CreateWindow(TEXT("BUTTONS"),
                Name[i],
                BS_AUTORADIOBUTTON|WS_VISIBLE| WS_CHILD,
                2*cxChar, cyChar * (2+2*i),
                 10* cxChar, 7 * cyChar/4,
                hwnd, (HMENU)i,
                ((LPCREATESTRUCT)lParam)->hInstance, NULL);
        }

        //CreateWindow(TEXT("BUTTONS"),
        //    TEXT("美女们"),
        //    BS_GROUPBOX | WS_CHILD | WS_VISIBLE,
        //    cxChar, cyChar / 2,
        //    12 * cxChar, 10 * cyChar,
        //    hwnd, (HMENU)GROUPBOX,
        //    ((LPCREATESTRUCT)lParam)->hInstance, NULL);
        return 0;
    
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}


代码如上,理论上讲应该会出现四个按钮,但是运行起来并没有按钮。
运行结果如图

img

请问哪一步做错了导致这样的结果呢?

  • 写回答

4条回答 默认 最新

  • ForeverGreenDam 2024-07-23 19:50
    关注

    此贴终结,我以为CreateWindow函数第一个参数类名是可以随便起的,是我理解错了。
    以下是正确解
    在调用 CreateWindow 函数时,控件的类名应该是 "BUTTON"(字符串类型),而不是 "BUTTONS"。只要把 hwndButton= CreateWindow(TEXT("BUTTONS"), ... 中的 "BUTTONS" 替换成 "BUTTON",你的按钮应该就能正常显示了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 7月31日
  • 已采纳回答 7月23日
  • 创建了问题 7月23日

悬赏问题

  • ¥20 c语言写的8051单片机存储器mt29的模块程序
  • ¥60 求直线方程 使平面上n个点在直线同侧并且距离总和最小
  • ¥50 java算法,给定试题的难度数量(简单,普通,困难),和试题类型数量(单选,多选,判断),以及题库中各种类型的题有多少道,求能否随机抽题。
  • ¥50 rk3588板端推理
  • ¥250 opencv怎么去掉 数字0中间的斜杠。
  • ¥15 这种情况的伯德图和奈奎斯特曲线怎么分析?
  • ¥250 paddleocr带斜线的0很容易识别成9
  • ¥15 电子档案元素采集(tiff及PDF扫描图片)
  • ¥15 flink-sql-connector-rabbitmq使用
  • ¥15 zynq7015,PCIE读写延时偏大