2016-03-23 8 views
0

私は単純な電卓を作成していますが、すべての要素のスケーリングに問題があります。私はそのようなことを得るコンパイルした後ようにwinapiのボタンのスケーリング

#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); 
... 
} 

と...

:彼らは、メインウィンドウと拡張する必要がありますが、私はどのように行うには考えているようなもの。ここ は、コードの一部です: enter image description here

どのようにするには?事前に 感謝:)

+3

が見えます。新しいクライアントサイズのために 'SetWindowPosition()'を使って 'WM_SIZE'メッセージを監視し、子コントロールのサイズを変更してください。 –

+0

...最後にすべての 'SetWindowPosition'の後に' UpdateWindow(hWnd) 'を呼び出します。 – i486

+0

質問に不明です。何が問題なのですか?それは働いているようです。 –

答えて

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); 
    ... 
} 
+0

私はあなたが言ったことをしましたが、それはまだ動作していません。私は何を間違えたの? (コードが更新されました) – user2999425

+0

コードをさらに表示してください。 'WINDOWSIZEW'と' WINDOWSIZEH'は 'resize_window()'で更新されていますか? –