2013-06-02 1 views
3

비트 맵 이미지로 도구 모음을 만들 때 단추 크기에 문제가 있습니다.
이 이미지 크기는 20/20 픽셀입니다.도구 모음의 단추 크기 - win32 프로그램

enter image description here

나는 도구 모음을 만들고, 20 분의 20 픽셀로 버튼의 크기를 설정,이 코드 :

SendMessage(hToolbar, TB_SETBUTTONSIZE, 0, MAKELPARAM(20, 20)); 

나는 빨간색과 녹색으로 색 구성표를 설정, 그래서 커서가 버튼 위에있을 때 버튼 프레임이 선명하게 표시됩니다.

는 커서 버튼 위에 서 때 내가 무엇을보고이 :

enter image description here

버튼의 크기를 알 수 있듯이 20 \ 20 픽셀,하지만 26 개 픽셀이 아니다. 왜 그렇게 된거야?

또 하나의 질문은 마우스 커서가 위에있을 때 강조 표시 버튼을 취소 할 수 있으며 대신 커서를 버튼 위로 가져 가면 뜨거운 이미지 목록 (TB_SETHOTIMAGELIST 메시지)을 설정합니다. 단추를 강조 표시하지 않고 뜨거운 이미지가 표시됩니다.

#include <windows.h> 
#include <stdlib.h> 
#include <CommCtrl.h> 
#pragma comment(lib, "comctl32.lib") 

#define IDB_PRINT 40000 

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

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    instance = hInstance; 

    WNDCLASSEX wcex; 

    wcex.cbSize = sizeof(WNDCLASSEX); 
    wcex.style   = CS_HREDRAW | CS_VREDRAW; 
    wcex.lpfnWndProc = WndProc; 
    wcex.cbClsExtra  = 0; 
    wcex.cbWndExtra  = 0; 
    wcex.hInstance  = hInstance; 
    wcex.hIcon   = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); 
    wcex.hCursor  = LoadCursor(NULL, IDC_ARROW); 
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 
    wcex.lpszMenuName = NULL; 
    wcex.lpszClassName = L"Example"; 
    wcex.hIconSm  = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); 

    RegisterClassEx(&wcex); 

    HWND hWnd = CreateWindow(L"Example", L"", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 
     500, 500, NULL, NULL, hInstance, NULL); 

    // Initialize common controls. 
    INITCOMMONCONTROLSEX icex; 
    icex.dwSize = sizeof(INITCOMMONCONTROLSEX); 
    icex.dwICC = ICC_COOL_CLASSES | ICC_BAR_CLASSES; 
    InitCommonControlsEx(&icex); 

    // create toolbar 
    HWND hToolbar = CreateWindowExW(WS_EX_TOOLWINDOW | TBSTYLE_EX_HIDECLIPPEDBUTTONS, TOOLBARCLASSNAME, NULL, CCS_NODIVIDER | WS_CHILD | WS_VISIBLE | CCS_ADJUSTABLE | TBSTYLE_ALTDRAG | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS, 
     0, 0, 0, 0, hWnd, (HMENU)0, instance, NULL); 

    SendMessage(hToolbar, TB_SETMAXTEXTROWS, 0, 0); 

    // create image list 
    HIMAGELIST hImageList = ImageList_Create(20,20, ILC_COLORDDB, 4, 0); 
    ImageList_Add(hImageList, LoadBitmap(instance, MAKEINTRESOURCEW(IDB_PRINT)), NULL); 

    // set the image list 
    SendMessage(hToolbar, TB_SETIMAGELIST, (WPARAM)0, (LPARAM)hImageList); 
    SendMessage(hToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); 

    // create button 
    TBBUTTON tbb[1] = 
    { 
     {0, 0, TBSTATE_ENABLED, BTNS_AUTOSIZE, {0}, 0, (INT_PTR)L"Print"}, 
    }; 

    // add button to the toolbar 
    SendMessage(hToolbar, (UINT)TB_ADDBUTTONS, 1, (LPARAM)&tbb); 
    SendMessage(hToolbar, TB_SETBUTTONSIZE, 0, MAKELPARAM(20, 20)); 
    SendMessage(hToolbar, TB_AUTOSIZE, 0, 0); 

    // set color scheme to blue 
    COLORSCHEME cs; 
    cs.dwSize = sizeof(cs); 
    cs.clrBtnShadow = RGB(255, 0, 0); 
    cs.clrBtnHighlight = RGB(0, 255, 0); 
    SendMessage(hToolbar, TB_SETCOLORSCHEME, 0, (LPARAM)&cs); 

    // show the toolbar 
    ShowWindow(hToolbar , SW_SHOW); 

    // show the main window 
    ShowWindow(hWnd, nCmdShow); 

    MSG msg; 

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

    return (int) msg.wParam; 
} 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
     case WM_CREATE: 
      return 0; 

     default: 
      return DefWindowProc(hWnd, message, wParam, lParam); 
    } 
} 

답변

2

Windows가 비트 맵 주위에 패딩을 추가합니다

은이 전체 코드입니다. 컨트롤에 대한 TB_GETPADDING 메시지를 사용하여 프로그래밍 방식으로 얼마나 많은 양을 감지 할 수 있습니다. 내 도구 모음의 생성에서,이 같은 수행

// By default Windows creates the tiles as 22x23, minus the padding area of 6x7, for a bitmap size of 16x16. 
    DWORD iSize = SendMessage(hTool, TB_GETBUTTONSIZE, 0, 0); 
    DWORD iPadSize = SendMessage(hTool, TB_GETPADDING, 0, 0); 

    // Build our bitmap 
    int xsize=LOWORD(iSize) - LOWORD(iPadSize); // width 
    int ysize=HIWORD(iSize) - HIWORD(iPadSize); // height 

당신은 TB_SETBUTTONSIZE와 자신의 비트 맵 크기를 설정할 수 있습니다,하지만 당신은 여전히 ​​패딩을 허용해야합니다.

관련 문제