본문 바로가기

Windows/Windows API

상태바 (status)

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPSTR lpszClass="MyState";

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
         ,LPSTR lpszCmdParam,int nCmdShow)
{
    HWND hWnd;
    MSG Message;
    WNDCLASS WndClass;
    g_hInst=hInstance;
    
    if(!hPrevInstance) {
        WndClass.cbClsExtra=0;
        WndClass.cbWndExtra=0;
        WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
        WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
        WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
        WndClass.hInstance=hInstance;
        WndClass.lpfnWndProc=(WNDPROC)WndProc;
        WndClass.lpszClassName=lpszClass;
        WndClass.lpszMenuName=NULL;
        WndClass.style=CS_HREDRAW | CS_VREDRAW;
        RegisterClass(&WndClass);
    }
    hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
        NULL,(HMENU)NULL,hInstance,NULL);
    ShowWindow(hWnd,nCmdShow);
    
    while(GetMessage(&Message,0,0,0)) {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }
    return Message.wParam;
}

#include <Commctrl.h>
HWND hState;

// 상태란에 현재 윈도우의 좌표를 출력한다.
void SetStatusText(HWND hWnd)
{
    RECT wrt;
    char str[128];

    GetWindowRect(hWnd, &wrt);
    wsprintf(str, "Left : %d", wrt.left);
    SendMessage(hState, SB_SETTEXT, 0, (LPARAM)str);
    wsprintf(str, "Top : %d", wrt.top);
    SendMessage(hState, SB_SETTEXT, 1, (LPARAM)str);
    wsprintf(str, "Right : %d", wrt.right);
    SendMessage(hState, SB_SETTEXT, 2, (LPARAM)str);
    wsprintf(str, "Bottom : %d", wrt.bottom);
    SendMessage(hState, SB_SETTEXT, 3, (LPARAM)str);
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    int SBPart[4],i;
    switch(iMessage) {
    // 상태란을 만든다.
    case WM_CREATE:
        InitCommonControls();
        hState=CreateStatusWindow(WS_CHILD | WS_VISIBLE, "", hWnd,0);
        return 0;
    case WM_SIZE:
        // 메인 윈도우의 크기가 변경되면 상태란의 크기도 같이 변경되어야 한다.
        SendMessage(hState, WM_SIZE, wParam, lParam);

        // 변경된 폭에 맞게 상태란을 4등분한다.
        for (i=0;i<4;i++) {
            SBPart[i]=LOWORD(lParam)/4*(i+1);
        }
        SendMessage(hState, SB_SETPARTS, 4, (LPARAM)SBPart);

        // 메인 윈도우의 좌표 출력
        SetStatusText(hWnd);
        return 0;
    // 메인 윈도우의 위치가 변경되면 상태란의 텍스트도 변경한다.
    case WM_MOVE:
        SetStatusText(hWnd);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}