【问题标题】:Resizing Window Glitch in C在 C 中调整窗口故障的大小
【发布时间】:2021-12-25 20:43:05
【问题描述】:

我需要用 C 语言创建一个 WinAPI 窗口。不是 C++。在 C 中,当我制作窗口时,调整大小有问题。当我将其调整为更大时,它会生成一个黑色背景,其中有奇怪的白色补丁。解决此问题的唯一方法是将其设为原始大小。 C++ 不会发生这种情况。我怎样才能解决这个问题?它编译没有错误。

正常尺寸: It displays correctly

最大化: It makes a strange effect.

代码:
wmain.h

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

const wchar_t* szWndClassName = L"WindowClass"; const wchar_t* szWndName = L"Notepad";
int width = 600, height = 400;
HINSTANCE hInst; HWND hWnd;
WNDCLASS wc;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

RECT rect;

int CenterWindow(HWND parent_window, int width, int height)
{
    GetClientRect(parent_window, &rect);
    rect.left = (rect.right / 2) - (width / 2);
    rect.top = (rect.bottom / 2) - (height / 2);
    return 0;
}

wmain.c

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include "wmain.h"

#pragma warning (disable: 28251)
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszCMDArgs, int nCMDShow)
{
    hInst = hThisInst;

    wc.lpszClassName = szWndClassName;
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInst;
    wc.hCursor = LoadCursor(wc.hInstance, L"IDC_ARROW");
    wc.hIcon = LoadIcon(wc.hInstance, L"Resource Files/Images/Notepad.ico");

    if (!RegisterClass(&wc))
    {
        MessageBox(NULL, L"RegisterClassW failed!", L"Error", MB_ICONERROR);

        return 1;
    }

    CenterWindow(GetDesktopWindow(), width, height);

    hWnd = CreateWindow(szWndClassName, szWndName, WS_OVERLAPPEDWINDOW, rect.left, rect.top, width, height, NULL, NULL, hInst, NULL);

    if (!hWnd)
    {
        MessageBox(NULL, L"CreateWindowW failed!", L"Error", MB_ICONERROR);

        return 2;
    }

    ShowWindow(hWnd, nCMDShow);
    UpdateWindow(hWnd);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }


    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
    switch (msg)
    {
        case WM_CREATE:
            break;
        case WM_COMMAND:
            switch (wp)
            {

            }
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, msg, wp, lp);
    }
}

编辑

要解决此问题,请将其添加到您的 WNDCLASS 属性中:

wc.hbrBacground = (HBRUSH)(COLOR_WINDOW + 1);

【问题讨论】:

  • 你为什么用WNDCLASS而不是WNDCLASSEX
  • @rkosegi 我不知道该怎么做。我尝试添加它,但结果相同。
  • @GovindParmar 因为 WNDCLASSEX 需要一大堆属性才能使 RegisterClassEx() 工作。
  • 在调用RegisterClass 后更改wc 的字段没有任何效果。考虑获取book

标签: c winapi


【解决方案1】:

要么在WNDCLASS中设置窗口背景,要么实现WM_PAINT消息重绘窗口。

【讨论】:

  • 我已经在@rkosegi 的帮助下找到了答案。但这使它到位。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 2020-01-16
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多