Kontrolka typu statusbar

Stronę tą wyświetlono już: 250 razy

Wstęp

Kontrolka statusbar (paska stanu) jest wykorzystywana w wielu programach graficznych czy też tekstowych do wyświetlania pewnych podstawowych informacji dotyczących interfejsu użytkownika oraz samego dokumentu, który jest w danym programie otworzony. Z tego też względu do zaczętego już wcześniej projektu programu o nazwie Rysowanie dodana zostanie ta właśnie kontrolka. W celu pozyskania kontrolki statusbar-u konieczne jest posłużenie się funkcją CreateWindowEx z nazwą klasy okna msctls_statusbar32.

Kod programu

Oto kod programu wzbogacony o nową kontrolkę statusbar-u:

Listing 1
  1. #include <windows.h>
  2. #include <commctrl.h>
  3. #include "resource.h"
  4. // ############## ID TOOLBAR-a ####################
  5. #define TB_ID 100
  6. // ############## ID PRZYCISKÓW TOOLBARD-a ##############
  7. #define ID_LINE 100
  8. #define ID_CIRCLE 101
  9. #define ID_RECTANGLE 102
  10. #define ID_SELECT 103
  11. // ###################### UCHWYT TOOLBAR-a #######################
  12. HWND toolbar;
  13. // ###################### UCHWYT STATUSBAR-a #######################
  14. HWND statusbar;
  15. // ################## PROCEDURA OKNA GŁÓWNEGO #######################
  16. LRESULT CALLBACK WndParentProc(HWND hParent, UINT msg, WPARAM wParam, LPARAM lParam){
  17. static RECT parent_rect;
  18. switch(msg){
  19. case WM_SIZE:
  20. {
  21. SetRect(&parent_rect, 0, 0, LOWORD(lParam), HIWORD(lParam));
  22. SendMessage(toolbar, TB_AUTOSIZE, NULL, NULL); // okunikat wysyłany w celu automatycznego ustawienia wymiarów okna toolbar
  23. SetWindowPos(statusbar, 0, 0, 0, 0, 0, SWP_NOZORDER); // automatyczne dostosowanie szerokości okna kontrolki statusbar-u do okna rodzica
  24. }
  25. break;
  26. case WM_COMMAND:
  27. {
  28. if((HWND)lParam == toolbar){
  29. switch(LOWORD(wParam)){
  30. case ID_LINE: // komunikat przychodzący od przycisku toolbar-a o identyfikatorze ID_LINE
  31. {
  32. SendMessage(statusbar, SB_SETTEXT, 2, (LPARAM)L"Rysowanie linii"); // ustawienie tekstu w ostatnim polu statusbar-u
  33. }
  34. break;
  35. case ID_CIRCLE: // to samo co poprzednio, tylko dla ID_CIRCLE
  36. {
  37. SendMessage(statusbar, SB_SETTEXT, 2, (LPARAM)L"Rysowanie okręgu"); // ustawienie tekstu w ostatnim polu statusbar-u
  38. }
  39. break;
  40. case ID_RECTANGLE: // to samo co poprzednio, tylko dla ID_RECTANGLE
  41. {
  42. SendMessage(statusbar, SB_SETTEXT, 2, (LPARAM)L"Rysowanie prostokąta"); // ustawienie tekstu w ostatnim polu statusbar-u
  43. }
  44. break;
  45. case ID_SELECT: // to samo co poprzednio, tylko dla ID_SELECT
  46. {
  47. SendMessage(statusbar, SB_SETTEXT, 2, (LPARAM)L"Rysowanie edycja"); // ustawienie tekstu w ostatnim polu statusbar-u
  48. }
  49. break;
  50. }
  51. }
  52. }
  53. break;
  54. case WM_DESTROY:
  55. {
  56. PostQuitMessage(0);
  57. }
  58. break;
  59. }
  60. return DefWindowProc(hParent,msg, wParam, lParam);
  61. }
  62. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int){
  63. // ####################### Operacje związane z rejestracją okna głównego ########################
  64. wchar_t parentWndClass[] = L"Okno główne programu Rysowanie";
  65. WNDCLASS wnd;
  66. wnd.cbClsExtra = NULL;
  67. wnd.cbWndExtra = NULL;
  68. wnd.hbrBackground = NULL;
  69. wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
  70. wnd.hIcon = LoadIcon(NULL, IDC_ICON);
  71. wnd.hInstance = hInst;
  72. wnd.lpfnWndProc = WndParentProc;
  73. wnd.lpszClassName = parentWndClass;
  74. wnd.lpszMenuName = NULL;
  75. wnd.style = CS_VREDRAW|CS_HREDRAW;
  76. if(!RegisterClass(&wnd)){
  77. MessageBox(NULL, L"Nie zarejestrowano klasy okna", L"Błąd", MB_OK);
  78. return 0;
  79. }
  80. HWND parent_window = CreateWindow(parentWndClass, L"Rysowanie", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL);
  81. // ################# Inicjalizowanie tablicy struktur niezbędnej do utworzenia toolbar-a #########################
  82. TBBUTTON bt[4]; // tablica struktur przycisków toolbar-a
  83. int i = 0; // indeks
  84. bt[i].dwData = 0; // brak dodatkowych danych
  85. bt[i].fsState = TBSTATE_ENABLED; // stan przycisku (w tym przypadku odblokowany)
  86. bt[i].fsStyle = TBSTYLE_CHECKGROUP; // styl przycisku (w tym przypadku grupowanie z innymi przyciskami)
  87. bt[i].iBitmap = i; // indeks wycinka bitmay
  88. bt[i].idCommand = ID_LINE; // identyfikator przycisku dla rysowania linii
  89. bt[i].iString = i; // indeks tekstu wyświetlanego pod przyciskiem
  90. i++;
  91. bt[i].dwData = 0;
  92. bt[i].fsState = TBSTATE_ENABLED;
  93. bt[i].fsStyle = TBSTYLE_CHECKGROUP;
  94. bt[i].iBitmap = i;
  95. bt[i].idCommand = ID_CIRCLE; // idnetyfikator przycisku dla rysowania okręgu
  96. bt[i].iString = i;
  97. i++;
  98. bt[i].dwData = 0;
  99. bt[i].fsState = TBSTATE_ENABLED;
  100. bt[i].fsStyle = TBSTYLE_CHECKGROUP;
  101. bt[i].iBitmap = i;
  102. bt[i].idCommand = ID_RECTANGLE; // identyfikator przycisku dla rysowania prostokąta
  103. bt[i].iString = i;
  104. i++;
  105. bt[i].dwData = 0;
  106. bt[i].fsState = TBSTATE_ENABLED;
  107. bt[i].fsStyle = TBSTYLE_CHECKGROUP;
  108. bt[i].iBitmap = i;
  109. bt[i].idCommand = ID_SELECT; // identyfikator przycisku dla zaznaczania obiektów
  110. bt[i].iString = i;
  111. toolbar = CreateToolbarEx( // tworzenie toolbar-a
  112. parent_window, // okno rodzica
  113. WS_CHILD|WS_VISIBLE|TBSTYLE_FLAT|TBSTYLE_WRAPABLE, // style: okno potomne; widoczny; płaskie przyciski; przyciski zwijane, gdy nie mogą się zmieścić w oknie programu
  114. TB_ID, // identyfikator toolbar-a
  115. 4, // liczba fragmentów wycinanych z bitmapy
  116. hInst, // uchwyt instancji programu
  117. IDB_TB_BITMAP, // identyfikator bitmapy zawartej w zasobach programu
  118. bt, // tablica struktur opisujących przyciski
  119. 4, // rozmiar tablicy struktur opisujących przyciski
  120. 48, // szerokość przycisku
  121. 48, // wysokość przycisku
  122. 42, // szerokość bitmapy
  123. 42, // wysokość bitmapu
  124. sizeof(TBBUTTON) // rozmiar struktury TBBUTTON
  125. );
  126. SendMessage(toolbar, TB_ADDSTRING, 0, (LPARAM)L"OdcinekOkrągProstokątZaznaczanie"); // ustawianie tekstu pod obrazkami przycisków toolbar-u
  127. SendMessage(toolbar, TB_AUTOSIZE, NULL, NULL); // automatyczne dostosowanie rozmiaru okna do okna rodzica
  128. // ############################# TWORZENIE STATUS BARU ###############################
  129. statusbar = CreateWindowEx(0, L"msctls_statusbar32",L"",WS_CHILD|WS_VISIBLE, 0, 0, 100, 100, parent_window, 0 ,hInst, 0); // pozyskiwanie uchwytu okna
  130. int parts[3]={120,260,-1}; // szerokość poszczególnych pól statusbar-u
  131. SendMessage(statusbar, SB_SETPARTS, 3, (LPARAM)parts); // ustawianie liczby pól oraz ich szerokości
  132. SendMessage(statusbar, SB_SETTEXT, 0, (LPARAM)L"X= "); // ustawienie tekstu w polu pierwszym
  133. SendMessage(statusbar, SB_SETTEXT, 1, (LPARAM)L"Y= "); // ustawienie tekstu w polu drugim
  134. // ####################################################################################
  135. RECT r;
  136. POINT pt;
  137. SendMessage(toolbar,TB_GETRECT,ID_LINE,(LPARAM)&r); // pobieranie prostokąta przycisku o identyfikatorze ID_LINE
  138. // tutaj pozyskuję współrzędne środka przycisku
  139. pt.x = (r.right + r.left) / 2;
  140. pt.y = (r.bottom + r.top) / 2;
  141. // A tutaj wysyłam komunikaty WM_LBUTONDOWN i WM_LBUTTONUP w celu zaznaczenia przycisku o identyfikatorze ID_LINE
  142. SendMessage(toolbar,WM_LBUTTONDOWN,MK_LBUTTON,MAKELONG(pt.x,pt.y));
  143. SendMessage(toolbar,WM_LBUTTONUP,MK_LBUTTON,MAKELONG(pt.x,pt.y));
  144. ShowWindow(parent_window, SW_NORMAL);
  145. UpdateWindow(parent_window);
  146. MSG msg;
  147. while(GetMessage(&msg, 0,0,0)){
  148. TranslateMessage(&msg);
  149. DispatchMessage(&msg);
  150. }
  151. return 0;
  152. }

Poniżej zamieszczam widok programu po dodaniu do niego kontrolki status_bar:

Okno programu Rysowanie wzbogacone o statusbar
Rys. 1
Okno programu Rysowanie wzbogacone o statusbar.

Komentarze