Stronę tą wyświetlono już: 2327 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:
#include <windows.h>
#include <commctrl.h>
#include "resource.h"
// ############## ID TOOLBAR-a ####################
#define TB_ID 100
// ############## ID PRZYCISKÓW TOOLBARD-a ##############
#define ID_LINE 100
#define ID_CIRCLE 101
#define ID_RECTANGLE 102
#define ID_SELECT 103
// ###################### UCHWYT TOOLBAR-a #######################
HWND toolbar;
// ###################### UCHWYT STATUSBAR-a #######################
HWND statusbar;
// ################## PROCEDURA OKNA GŁÓWNEGO #######################
LRESULT CALLBACK WndParentProc(HWND hParent, UINT msg, WPARAM wParam, LPARAM lParam){
static RECT parent_rect;
switch(msg){
case WM_SIZE:
{
SetRect(&parent_rect, 0, 0, LOWORD(lParam), HIWORD(lParam));
SendMessage(toolbar, TB_AUTOSIZE, NULL, NULL); // okunikat wysyłany w celu automatycznego ustawienia wymiarów okna toolbar
SetWindowPos(statusbar, 0, 0, 0, 0, 0, SWP_NOZORDER); // automatyczne dostosowanie szerokości okna kontrolki statusbar-u do okna rodzica
}
break;
case WM_COMMAND:
{
if((HWND)lParam == toolbar){
switch(LOWORD(wParam)){
case ID_LINE: // komunikat przychodzący od przycisku toolbar-a o identyfikatorze ID_LINE
{
SendMessage(statusbar, SB_SETTEXT, 2, (LPARAM)L"Rysowanie linii"); // ustawienie tekstu w ostatnim polu statusbar-u
}
break;
case ID_CIRCLE: // to samo co poprzednio, tylko dla ID_CIRCLE
{
SendMessage(statusbar, SB_SETTEXT, 2, (LPARAM)L"Rysowanie okręgu"); // ustawienie tekstu w ostatnim polu statusbar-u
}
break;
case ID_RECTANGLE: // to samo co poprzednio, tylko dla ID_RECTANGLE
{
SendMessage(statusbar, SB_SETTEXT, 2, (LPARAM)L"Rysowanie prostokąta"); // ustawienie tekstu w ostatnim polu statusbar-u
}
break;
case ID_SELECT: // to samo co poprzednio, tylko dla ID_SELECT
{
SendMessage(statusbar, SB_SETTEXT, 2, (LPARAM)L"Rysowanie edycja"); // ustawienie tekstu w ostatnim polu statusbar-u
}
break;
}
}
}
break;
case WM_DESTROY:
{
PostQuitMessage(0);
}
break;
}
return DefWindowProc(hParent,msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int){
// ####################### Operacje związane z rejestracją okna głównego ########################
wchar_t parentWndClass[] = L"Okno główne programu Rysowanie";
WNDCLASS wnd;
wnd.cbClsExtra = NULL;
wnd.cbWndExtra = NULL;
wnd.hbrBackground = NULL;
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
wnd.hIcon = LoadIcon(NULL, IDC_ICON);
wnd.hInstance = hInst;
wnd.lpfnWndProc = WndParentProc;
wnd.lpszClassName = parentWndClass;
wnd.lpszMenuName = NULL;
wnd.style = CS_VREDRAW|CS_HREDRAW;
if(!RegisterClass(&wnd)){
MessageBox(NULL, L"Nie zarejestrowano klasy okna", L"Błąd", MB_OK);
return 0;
}
HWND parent_window = CreateWindow(parentWndClass, L"Rysowanie", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL);
// ################# Inicjalizowanie tablicy struktur niezbędnej do utworzenia toolbar-a #########################
TBBUTTON bt[4]; // tablica struktur przycisków toolbar-a
int i = 0; // indeks
bt[i].dwData = 0; // brak dodatkowych danych
bt[i].fsState = TBSTATE_ENABLED; // stan przycisku (w tym przypadku odblokowany)
bt[i].fsStyle = TBSTYLE_CHECKGROUP; // styl przycisku (w tym przypadku grupowanie z innymi przyciskami)
bt[i].iBitmap = i; // indeks wycinka bitmay
bt[i].idCommand = ID_LINE; // identyfikator przycisku dla rysowania linii
bt[i].iString = i; // indeks tekstu wyświetlanego pod przyciskiem
i++;
bt[i].dwData = 0;
bt[i].fsState = TBSTATE_ENABLED;
bt[i].fsStyle = TBSTYLE_CHECKGROUP;
bt[i].iBitmap = i;
bt[i].idCommand = ID_CIRCLE; // idnetyfikator przycisku dla rysowania okręgu
bt[i].iString = i;
i++;
bt[i].dwData = 0;
bt[i].fsState = TBSTATE_ENABLED;
bt[i].fsStyle = TBSTYLE_CHECKGROUP;
bt[i].iBitmap = i;
bt[i].idCommand = ID_RECTANGLE; // identyfikator przycisku dla rysowania prostokąta
bt[i].iString = i;
i++;
bt[i].dwData = 0;
bt[i].fsState = TBSTATE_ENABLED;
bt[i].fsStyle = TBSTYLE_CHECKGROUP;
bt[i].iBitmap = i;
bt[i].idCommand = ID_SELECT; // identyfikator przycisku dla zaznaczania obiektów
bt[i].iString = i;
toolbar = CreateToolbarEx( // tworzenie toolbar-a
parent_window, // okno rodzica
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
TB_ID, // identyfikator toolbar-a
4, // liczba fragmentów wycinanych z bitmapy
hInst, // uchwyt instancji programu
IDB_TB_BITMAP, // identyfikator bitmapy zawartej w zasobach programu
bt, // tablica struktur opisujących przyciski
4, // rozmiar tablicy struktur opisujących przyciski
48, // szerokość przycisku
48, // wysokość przycisku
42, // szerokość bitmapy
42, // wysokość bitmapu
sizeof(TBBUTTON) // rozmiar struktury TBBUTTON
);
SendMessage(toolbar, TB_ADDSTRING, 0, (LPARAM)L"Odcinek Okrąg Prostokąt Zaznaczanie "); // ustawianie tekstu pod obrazkami przycisków toolbar-u
SendMessage(toolbar, TB_AUTOSIZE, NULL, NULL); // automatyczne dostosowanie rozmiaru okna do okna rodzica
// ############################# TWORZENIE STATUS BARU ###############################
statusbar = CreateWindowEx(0, L"msctls_statusbar32",L"",WS_CHILD|WS_VISIBLE, 0, 0, 100, 100, parent_window, 0 ,hInst, 0); // pozyskiwanie uchwytu okna
int parts[3]={120,260,-1}; // szerokość poszczególnych pól statusbar-u
SendMessage(statusbar, SB_SETPARTS, 3, (LPARAM)parts); // ustawianie liczby pól oraz ich szerokości
SendMessage(statusbar, SB_SETTEXT, 0, (LPARAM)L"X= "); // ustawienie tekstu w polu pierwszym
SendMessage(statusbar, SB_SETTEXT, 1, (LPARAM)L"Y= "); // ustawienie tekstu w polu drugim
// ####################################################################################
RECT r;
POINT pt;
SendMessage(toolbar,TB_GETRECT,ID_LINE,(LPARAM)&r); // pobieranie prostokąta przycisku o identyfikatorze ID_LINE
// tutaj pozyskuję współrzędne środka przycisku
pt.x = (r.right + r.left) / 2;
pt.y = (r.bottom + r.top) / 2;
// A tutaj wysyłam komunikaty WM_LBUTONDOWN i WM_LBUTTONUP w celu zaznaczenia przycisku o identyfikatorze ID_LINE
SendMessage(toolbar,WM_LBUTTONDOWN,MK_LBUTTON,MAKELONG(pt.x,pt.y));
SendMessage(toolbar,WM_LBUTTONUP,MK_LBUTTON,MAKELONG(pt.x,pt.y));
ShowWindow(parent_window, SW_NORMAL);
UpdateWindow(parent_window);
MSG msg;
while(GetMessage(&msg, 0,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
Poniżej zamieszczam widok programu po dodaniu do niego kontrolki status_bar: