본문 바로가기

Windows/Windows API

툴바 (Toolbar)

#include <windows.h>

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

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 | WS_CLIPCHILDREN,
        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>
#include "resource.h"

// 툴바와 툴 버튼의 ID
#define ID_TOOLBAR 99
#define ID_BTN_CIRCLE 100
#define ID_BTN_RECT 101
#define ID_BTN_LINE 102

// 전역 변수
TBBUTTON ToolBtn[3];        // 툴 버튼 구조체
int Shape=ID_BTN_CIRCLE;    // 작업영역에 그릴 도형
HWND hToolBar;                // 툴바의 윈도우의 핸들
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    int i;
    switch(iMessage) {
    case WM_CREATE:
        InitCommonControls();
        // 툴 버튼 구조체를 초기화한다.
        for (i=0;i<3;i++) {
            ToolBtn[i].iBitmap=i;
            ToolBtn[i].idCommand=ID_BTN_CIRCLE+i;
            ToolBtn[i].fsState=TBSTATE_ENABLED;
            ToolBtn[i].fsStyle=TBSTYLE_CHECKGROUP;
            ToolBtn[i].dwData=0;
            ToolBtn[i].iString=0;
        }
        // 툴바를 만든다.
        hToolBar=CreateToolbarEx(hWnd, WS_CHILD | WS_VISIBLE | WS_BORDER
            | TBSTYLE_TOOLTIPS,
            ID_TOOLBAR, 3, g_hInst, RESTOOLBMP, ToolBtn, 3,
            16,16,30,30,sizeof(TBBUTTON));
        return 0;
    // 툴 버튼이 선택되었을 때의 처리
    case WM_COMMAND:
        switch (LOWORD(wParam)) {
        case ID_BTN_CIRCLE:
        case ID_BTN_RECT:
        case ID_BTN_LINE:
            Shape=LOWORD(wParam);
            InvalidateRect(hWnd, NULL, TRUE);
        }
        return 0;
    // 눌러진 버튼에 따라 해당 도형을 그린다.
    case WM_NOTIFY:
        switch (((LPNMHDR)lParam)->code) {
        case TTN_NEEDTEXT:
            switch (wParam) {
            case ID_BTN_CIRCLE:
                ((LPTOOLTIPTEXT)lParam)->lpszText="Circle";
                break;
            case ID_BTN_RECT:
                ((LPTOOLTIPTEXT)lParam)->lpszText="Rectangle";
                break;
            case ID_BTN_LINE:
                ((LPTOOLTIPTEXT)lParam)->lpszText="Line";
                break;
            }
        }
        return 0;
    // 툴바에 의해 선택된 도형을 그린다.
    case WM_PAINT:
        hdc=BeginPaint(hWnd, &ps);
        switch (Shape) {
        case ID_BTN_CIRCLE:
            Ellipse(hdc,10,50,200,240);
            break;
        case ID_BTN_RECT:
            Rectangle(hdc,10,50,200,240);
            break;
        case ID_BTN_LINE:
            MoveToEx(hdc,10,50,NULL);
            LineTo(hdc,200,240);
            break;
        }
        EndPaint(hWnd, &ps);
        return 0;
    // 메인 윈도우의 크기가 변경되면 툴 바의 크기도 변경된다.
    case WM_SIZE:
        SendMessage(hToolBar,WM_SIZE,0,0);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}