【问题标题】:Button scaling in winapiwinapi中的按钮缩放
【发布时间】:2016-03-23 00:20:48
【问题描述】:

我正在创建一个简单的计算器,但在缩放所有元素时遇到了问题。他们必须与主窗口一起缩放,但我不知道如何执行这样的事情 以下是部分代码:

#define ID_BUTTON0 0
#define ID_BUTTON1 1
#define ID_BUTTON2 2
#define ID_BUTTON3 3
#define ID_BUTTON4 4
...

case WM_CREATE:
{
    CreateWindow(L"STATIC", L"", WS_VISIBLE | WS_CHILD,0, 0, 0, 0,hWnd, HMENU(ID_TEXTFIELD), 0, NULL);
    CreateWindow(L"BUTTON", L"CE",WS_VISIBLE | WS_CHILD,0, 0, 0, 0,hWnd, HMENU(ID_BUTTONCE), 0, NULL);
    CreateWindow(L"BUTTON", L"C",WS_VISIBLE | WS_CHILD,0, 0, 0, 0,hWnd, HMENU(ID_BUTTONC), 0, NULL);
    CreateWindow(L"BUTTON", L"/",WS_VISIBLE | WS_CHILD,0, 0, 0, 0,hWnd, HMENU(ID_BUTTONDIV), 0, NULL);
    CreateWindow(L"BUTTON", L"X",WS_VISIBLE | WS_CHILD,0, 0, 0, 0,hWnd, HMENU(ID_BUTTONMUL), 0, NULL);
    CreateWindow(L"BUTTON", L"7",WS_VISIBLE | WS_CHILD,0, 0, 0, 0,hWnd, HMENU(ID_BUTTON7), 0, NULL);
    CreateWindow(L"BUTTON", L"8",WS_VISIBLE | WS_CHILD,0, 0, 0, 0,hWnd, HMENU(ID_BUTTON8), 0, NULL);
    CreateWindow(L"BUTTON", L"9",WS_VISIBLE | WS_CHILD,0, 0, 0, 0,hWnd, HMENU(ID_BUTTON9), 0, NULL);
    ...

    resize_window(hWnd);
}
break;
case WM_SIZE:
{
    resize_window(hWnd);
    UpdateWindow(hWnd);
    return 0;
}
void resize_window(HWND hWnd) {

int buttonxsize = WINDOWSIZEW / 4;
int buttonysize = WINDOWSIZEH / 6;
int posx = WINDOWSIZEW / 4;
int posy = WINDOWSIZEH / 6;
RECT rc;
GetClientRect(hWnd, &rc);
SetWindowPos(GetDlgItem(hWnd, ID_TEXTFIELD), 0, 0, 0, WINDOWSIZEW, buttonysize, SWP_NOZORDER);
SetWindowPos(GetDlgItem(hWnd, ID_BUTTONC), 0, 0, posy, buttonxsize, buttonysize, SWP_NOZORDER);
SetWindowPos(GetDlgItem(hWnd, ID_BUTTONCE), 0, posx, posy, buttonxsize, buttonysize, SWP_NOZORDER);
SetWindowPos(GetDlgItem(hWnd, ID_BUTTONDIV), 0, 2 * posx, posy, buttonxsize, buttonysize, SWP_NOZORDER);
SetWindowPos(GetDlgItem(hWnd, ID_BUTTONMUL), 0, 3 * posx, posy, buttonxsize, buttonysize, SWP_NOZORDER);
...
}

等等……

编译后得到这样的东西:

如何让它发挥作用?

【问题讨论】:

  • 看起来你已经拥有了大部分你需要的东西。注意WM_SIZE 消息并使用SetWindowPosition() 调整子控件的大小以适应新的客户端大小。
  • ...最后还是调用UpdateWindow(hWnd)SetWindowPosition
  • 我不清楚这个问题。究竟是什么问题?它似乎正在工作。

标签: user-interface winapi visual-c++


【解决方案1】:
HWND hwndTextField = CreateWindow(L"Static", L"",
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON | WS_TABSTOP,
        0, 0, WINDOWSIZEW, WINDOWSIZEH / 6,
        hWnd, NULL, GetModuleHandle(NULL), NULL);

hwndTextField 在堆栈上声明,一旦超出范围就会被遗忘,以后您将无法找到控件(无论如何不容易)。 hwndTextField 应声明为静态或全局。更好的是,使用HMENU 为每个控件分配一个ID。此 ID 可用于查找控件。此外,当您单击按钮时,它会发送带有该 ID 的 WM_COMMAND 消息。

这个控件的样式应该是WS_VISIBLE | WS_CHILD | WS_TABSTOP。但是WS_TABSTOP 会被忽略,除非它是在对话框中创建的。

并在单独的函数中调整控件的大小,以便可以从WM_CREATEWM_SIZE 完成

例如

#define ID_TEXT 100
...

case WM_CREATE:
{
CreateWindow(L"STATIC", L"", WS_VISIBLE | WS_CHILD, 
    0, 0, 0, 0, hWnd, HMENU(ID_TEXT), 0, NULL);
...
resize_window(hWnd);
}

case WM_SIZE:
{
resize_window(hWnd);
return 0;
}

void resize_window(HWND hwnd)
{
    RECT rc;
    GetClientRect(hwnd, &rc);

    //update ****
    WINDOWSIZEW = rc.right;
    WINDOWSIZEH = rc.bottom;

    ...
    SetWindowPos(GetDlgItem(hWnd, ID_TEXT), 0, x, y, w, h, SWP_NOZORDER);
    ...
}

【讨论】:

  • 我按照你说的做了,但还是不行。我做错了什么? (代码更新)
  • 显示更多代码。 WINDOWSIZEWWINDOWSIZEH 是否在 resize_window() 中更新?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多