2014-09-15 13 views
5

Tôi đang cố gắng để hiểu được hành vi của một thanh công cụ Windows - đặc biệt là như thế nào các giá trị sau tương tác:của Windows Toolbar - Kiểm soát kích thước nút và padding

  • kích thước của hình ảnh bitmap sử dụng
  • hiệu quả kích thước của một nút trên thanh công cụ
  • padding giữa hình ảnh và các nút cạnh
  • chiều cao của thanh công cụ

Văn bản được hiển thị bằng một nút không liên quan trong trường hợp của tôi.

Điều tôi thực sự muốn làm là cung cấp tùy chọn cho người dùng để anh có thể chọn từ một số kích thước nút thanh công cụ (hiển thị bitmap nói, 16x16, 32x32 hoặc 48x48 pixel) và hiển thị lại thanh công cụ cho phù hợp sau tùy chọn thay đổi giá trị. Điều này được thực hiện bằng cách phá hủy danh sách hình ảnh của thanh công cụ và xây dựng lại chúng với các bitmap thích hợp. Vấn đề tôi hiện có là khi chuyển từ kích thước 16 đến 48 và quay lại kích thước 16, thanh công cụ trông hơi khác so với trước đây.

Đây là những gì các thanh công cụ trông giống như khi ứng dụng khởi động (chính xác):

Before switching the toolbar size

Khi tôi chuyển sang kích thước 48 và ngược lại, nó trông giống như thế này (sai):

After switching to a larger size and back

Tất cả các nút đều cao hơn trước và mỗi nút thả xuống có thêm khoảng trống xung quanh bitmap và mũi tên thả xuống của nó.

(Đối với mục đích thử nghiệm, thanh công cụ đã được tạo đủ cao để chứa tất cả kích thước nút mà không yêu cầu tăng chiều cao. Điều này là loại trừ khả năng thay đổi kích thước nút bắt nguồn từ kích thước thanh công cụ có thể thay đổi tạm thời chuyển sang kích thước 48.)

Dường như đệm bổ sung đang được hiển thị giữa bitmap nút và cạnh nút - như thể xây dựng lại thanh công cụ với các bitmap/nút lớn hơn khiến Windows tăng nội bộ ý nghĩa), nhưng không giảm nó khi tôi xây dựng lại thanh công cụ với các bitmap/nút nhỏ hơn. Tuy nhiên, việc gửi TB_GETPADDING luôn trả về 0x00060007, điều này cho biết rằng padding chuẩn (chính xác) cho bitmap 16x16 được đặt ra.

Trong một nỗ lực để giải quyết vấn đề bằng cách thiết lập padding bản thân mình, tôi thiết lập phong cách TBSTYLE_AUTOSIZE trên tất cả các nút không phân cách (điều này là cần thiết để áp dụng padding). Với phong cách này, thậm chí không cần kêu gọi TB_SETPADDING, sau khi chuyển sang kích thước 48 và ngược lại, các thanh công cụ trông như thế này:

After switching to a larger size and back, with TBSTYLE_AUTOSIZE

Trong trường hợp này, chiều cao nút cũng là sai.

Câu hỏi đặt ra là: Điều gì khiến các nút được hiển thị khác nhau sau khi tạo lại danh sách hình ảnh?

Một số sang một bên lưu ý:

  • Khi xây dựng các thanh công cụ, tôi gọi TB_SETBITMAPSIZE, nhưng không phải TB_SETBUTTONSIZE cũng không TB_SETPADDING, vì kích thước bitmap là tất cả tôi có, và tôi cho rằng kích thước nút sẽ được bắt nguồn một cách chính xác từ đó .
  • Tôi biết rằng tôi có thể đơn giản xây dựng toàn bộ cửa sổ thanh công cụ từ đầu (không chỉ danh sách hình ảnh), nhưng muốn tránh điều đó, vì vậy tôi có thể tiếp tục làm việc với cùng một cửa sổ thanh công cụ.
  • Tôi biết phong cách thanh công cụ CCS_NORESIZE (hiện được đặt) và thông báo TB_AUTOSIZE, nhưng các thử nghiệm với chúng chưa dẫn đến bất kỳ thông tin chi tiết nào.
+0

Xin chào, bạn đang sử dụng ngôn ngữ nào? –

+0

Steve: Tôi đang sử dụng C++. – Dabbler

Trả lời

2

Tôi không thể nói vấn đề là gì (không có mã trong câu hỏi) nhưng có khả năng nhất là rằng giải pháp hủy danh sách hình ảnh gây ra điều này. Bạn không cần phải hủy các danh sách nhưng để xóa các nút và sau đó thêm các nút mới. Đoạn mã bên dưới hoạt động tốt:

Tạo ToolBar:

if((toolBarHwnd = CreateWindowEx(
       0, 
       TOOLBARCLASSNAME,, 
       NULL, 
       WS_VISIBLE | WS_CHILD | TBSTYLE_WRAPABLE, 
       0, 
       0, //820, 
       0, 
       0, 
       winHwnd, //main window 
       (HMENU)IDC_TOOLBAR, 
       hThisInstance, 
       NULL 
      )) == NULL){/*Error*/} 

Tạo ImageList của cho hình ảnh của bạn:

HIMAGELIST g_hImageListSmall = NULL, g_hImageListMedium = NULL, g_hImageListLarge = NULL; 
int numButtons = 3 
g_hImageListSmall = ImageList_Create(16, 16, // Dimensions of individual bitmaps. 
           ILC_COLOR16 | ILC_MASK, // Ensures transparent background. 
           numButtons, 0); 
g_hImageListMedium = ImageList_Create(32, 32, 
           ILC_COLOR16 | ILC_MASK, 
           numButtons, 0); 
g_hImageListLarge = ImageList_Create(48, 48, 
           ILC_COLOR16 | ILC_MASK, 
           numButtons, 0); 

Thêm hình ảnh vào danh sách:

HBITMAP hBitmapImageSmall = NULL, hBitmapImageMedium = NULL, hBitmapImageLarge = NULL; 
hBitmapImageSmall = LoadImage(NULL, L"....YourBitmap.bmp", IMAGE_BITMAP, 16, 16, 0x10); 
ImageList_Add(g_hImageListSmall , hBitmapImageSmall, NULL); 
ImageList_Add(g_hImageListSmall , hBitmapImageSmall, NULL); 
ImageList_Add(g_hImageListSmall , hBitmapImageSmall, NULL); //I am using the same image 

hBitmapImageMedium = LoadImage(NULL, L"....YourBitmap.bmp", IMAGE_BITMAP, 32, 32, 0x10); 
ImageList_Add(g_hImageListSmall , hBitmapImageMedium , NULL); 
ImageList_Add(g_hImageListSmall , hBitmapImageMedium , NULL); 
ImageList_Add(g_hImageListSmall , hBitmapImageMedium , NULL); 

Cùng một wi thứ một lớn (48x48)

Thêm g_hImageListSmall đến ToolBar cho sự khởi đầu:

//Set the image list. 
SendMessage(toolBarHwnd, TB_SETIMAGELIST, (WPARAM)0, (LPARAM)g_hImageListSmall); 

// Initialize button info. 
// IDM_NEW, IDM_OPEN, and IDM_SAVE are application-defined command constants. 
TBBUTTON tbButtons[numButtons] = 
{ 
    { 0, IDM_NEW, TBSTATE_ENABLED, BTNS_AUTOSIZE, {0}, 0, (INT_PTR)NULL }, 
    { 1, IDM_OPEN, TBSTATE_ENABLED, BTNS_AUTOSIZE, {0}, 0, (INT_PTR)NULL}, 
    { 2, IDM_SAVE, TBSTATE_ENABLED, BTNS_AUTOSIZE, {0}, 0, (INT_PTR)NULL} 
}; 

// Add buttons. 
SendMessage(toolBarHwnd, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); 
SendMessage(toolBarHwnd, TB_ADDBUTTONS, (WPARAM)numButtons, (LPARAM)&tbButtons); 

// Resize the toolbar 
SendMessage(toolBarHwnd, TB_AUTOSIZE, 0, 0); 

Đó là bước đầu tiên.

Viết hai chức năng:

Khi bao giờ bạn muốn thay đổi kích thước của các nút trong ToolBar:

RemoveButtons(); 
AddButtons(LARGE); //or SMALL, MEDIUM 

Tài liệu tham khảo:

How to Create Toolbars
How to Customize Toolbars

4

Điều khiển chung là một nhà máy lỗi lớn trong Windows. Microsoft đã gặp rất nhiều rắc rối trong việc giữ chúng tương thích trên 6 phiên bản Windows chính và 10 phiên bản comctl32.dll. Đặc biệt là các trình kết xuất kiểu trực quan đã là một điểm vấn đề.

Vấn đề cốt lõi là api cho chúng được đặt trong đá cách đây 18 năm không có cách hợp lý để làm cho nó hoạt động khác với cách hoạt động trong bản phát hành đầu tiên của chúng. Mã của họ đã thu được rất nhiều thỏa thuận hack appcompat để đạt được điều này. Một hack như vậy sẽ cho bác sĩ ví dụ một giá trị đã được trả về bởi phiên bản trước để chương trình khách hàng không có ý tưởng, và không cần biết, rằng nó đang làm việc với một phiên bản rất khác với phiên bản nó đã được thử nghiệm.

Điều này có tác dụng phụ, loại bạn sẽ khám phá khi bạn sử dụng các điều khiển theo cách khác thường rất khác với cách chúng thường được sử dụng bởi các chương trình Windows và thịt. Chính xác như kịch bản của bạn. Tỷ lệ cược rất cao mà bạn đang chiến đấu với trạng thái nội bộ của thanh công cụ mà bạn không thể nhìn thấy và không được khôi phục đúng cách khi bạn chuyển đổi kích thước. Khá không thể tha thứ, trạng thái bên trong đó không thể nhìn thấy được. Khác với các tác dụng phụ không mong muốn.

Giải pháp là giải pháp bạn đã biết. Tạo lại thanh công cụ từ đầu. Nó không thể đi sai theo cách đó.

+1

Tôi đã bị đau đầu vì những điều khiển đó. Không phải đề cập đến một số DLL Hell nhận được trong cách, chỉ để cho vui. –

Các vấn đề liên quan