Работа с элементами управления
Работа с меню
Плавающее меню содержит строки "Спрятать", "Показать","Масштаб", "Свойства". Строка "Масштаб" указывает на временное меню из четырех зависимых строк: "50%", "100%", "150%" и "200%", при выборе одна из которых отмечается кружочком.
В строке состояния сообщать о строках меню, включая состояние строк.
Код программы
#include <windows.h>
#include <commctrl.h>
#include "resource.h"
HINSTANCE hInst;
HMENU hMenu;
HWND hStatusBar;
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)
{
char *ClassName="MainWindow";
char *Title="Window";
hInst=hInstance;
MSG msg;
WNDCLASS wc;
memset(&wc,0,sizeof(wc));
wc.lpszClassName=ClassName; // Имя класса окон
wc.lpfnWndProc=(WNDPROC)WndProc; // Адрес оконной функции
wc.style=CS_HREDRAW|CS_VREDRAW; // Стиль класса
wc.hInstance=hInstance; // Экземпляр приложения
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); // Пиктограмма для окон
wc.hCursor=LoadCursor(NULL,IDC_ARROW); // Курсор мыши для окон
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); // Кисть для окон
wc.lpszMenuName=NULL; // Ресурс меню окон
wc.cbClsExtra=0; // Дополнительная память
wc.cbWndExtra=0; // Дополнительная память
RegisterClass(&wc);
HWND hWnd=CreateWindow(ClassName,Title,WS_OVERLAPPEDWINDOW,
GetSystemMetrics(SM_CXSCREEN)/10,GetSystemMetrics(SM_CYSCREEN)/10,
GetSystemMetrics(SM_CXSCREEN)/10*8,GetSystemMetrics(SM_CYSCREEN)/10*8,
NULL,NULL,hInst,NULL);
hMenu=LoadMenu(hInst,MAKEINTRESOURCE(IDR_MENU));
SetMenu(hWnd,hMenu);
hStatusBar=CreateStatusWindow(WS_CHILD|WS_VISIBLE,"",hWnd,1);
SendMessage(hStatusBar,SB_SETTEXT,SBT_NOBORDERS,(LPARAM)"Ни один пункт меню не выбран");
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
ShowWindow(hStatusBar,SW_SHOW);
UpdateWindow(hStatusBar);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_PAINT:
{
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hWnd,&ps);
TextOut(hDC,20,20,"Hello",5);
EndPaint(hWnd,&ps);
};break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_50:
{
HMENU hSubMenu;
hSubMenu=GetSubMenu(hMenu,2);
CheckMenuItem(hSubMenu,0,MF_BYPOSITION|MF_CHECKED);
CheckMenuItem(hSubMenu,1,MF_BYPOSITION|MF_UNCHECKED);
CheckMenuItem(hSubMenu,2,MF_BYPOSITION|MF_UNCHECKED);
CheckMenuItem(hSubMenu,3,MF_BYPOSITION|MF_UNCHECKED);
};break;
case ID_100:
{
HMENU hSubMenu;
hSubMenu=GetSubMenu(hMenu,2);
CheckMenuItem(hSubMenu,0,MF_BYPOSITION|MF_UNCHECKED);
CheckMenuItem(hSubMenu,1,MF_BYPOSITION|MF_CHECKED);
CheckMenuItem(hSubMenu,2,MF_BYPOSITION|MF_UNCHECKED);
CheckMenuItem(hSubMenu,3,MF_BYPOSITION|MF_UNCHECKED);
};break;
case ID_150:
{
HMENU hSubMenu;
hSubMenu=GetSubMenu(hMenu,2);
CheckMenuItem(hSubMenu,0,MF_BYPOSITION|MF_UNCHECKED);
CheckMenuItem(hSubMenu,1,MF_BYPOSITION|MF_UNCHECKED);
CheckMenuItem(hSubMenu,2,MF_BYPOSITION|MF_CHECKED);
CheckMenuItem(hSubMenu,3,MF_BYPOSITION|MF_UNCHECKED);
};break;
case ID_200:
{
HMENU hSubMenu;
hSubMenu=GetSubMenu(hMenu,2);
CheckMenuItem(hSubMenu,0,MF_BYPOSITION|MF_UNCHECKED);
CheckMenuItem(hSubMenu,1,MF_BYPOSITION|MF_UNCHECKED);
CheckMenuItem(hSubMenu,2,MF_BYPOSITION|MF_UNCHECKED);
CheckMenuItem(hSubMenu,3,MF_BYPOSITION|MF_CHECKED);
};break;
};break;
case WM_MENUSELECT:
switch (LOWORD(wParam))
{
case ID_HIDE:
{
SendMessage(hStatusBar,SB_SETTEXT,SBT_NOBORDERS,(LPARAM)"Что-то скроем");
};break;
case ID_SHOW:
{
SendMessage(hStatusBar,SB_SETTEXT,SBT_NOBORDERS,(LPARAM)"Что-то покажем");
};break;
case ID_PROPERTY:
{
SendMessage(hStatusBar,SB_SETTEXT,SBT_NOBORDERS,(LPARAM)"Какие-то свойства");
};break;
case ID_50:
{
SendMessage(hStatusBar,SB_SETTEXT,SBT_NOBORDERS,(LPARAM)"50");
};break;
case ID_100:
{
SendMessage(hStatusBar,SB_SETTEXT,SBT_NOBORDERS,(LPARAM)"100");
};break;
case ID_150:
{
SendMessage(hStatusBar,SB_SETTEXT,SBT_NOBORDERS,(LPARAM)"150");
};break;
case ID_200:
{
SendMessage(hStatusBar,SB_SETTEXT,SBT_NOBORDERS,(LPARAM)"200");
};break;
};break;
case WM_EXITMENULOOP:
{
SendMessage(hStatusBar,SB_SETTEXT,SBT_NOBORDERS,(LPARAM)"Ни один пункт меню не выбран");
};break;
case WM_DESTROY:
{
PostQuitMessage(0);
}; break;
default: return DefWindowProc(hWnd,msg,wParam,lParam);
}
return 0;
}
Копии экранов
Работа с элементами управления
Во временном окне создать пустые списки для хранения имен файлов и путей к этим файлам. С помощью стандартной панели выбрать имена файлов в любом каталоге и записать их данные в списки временного окна. Временное окно должно обрабатывать клавиатурные сообщения так же, как и модальные панели.
В диалоговом окне размещается список и три кнопки: добавление, удаление и ок.
При добавлении в список вызывается стандартная диалоговая панель с помощью функции GetOpenFileName. В этой панели можно выбирать файл в любом каталоге, когда выбран нужный файл, путь к этому файлу и сам название самого файла с его расширением добавляются в список. При нажатии на кнопку удалить, из списка удаляется выделенная запись, если запись не выделена отображается окно об ошибке.
case WM_INITDIALOG:
hListBox = GetDlgItem(hDlg, IDC_LIST1);
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hCtrl;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_ADD_ELEMENT:
strcpy(szFile, "");
success = GetOpenFileName(&ofn);
if (success)
{
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)szFile);
}
break;
case IDC_DELETE_ELEMENT:
iCurItem = SendMessage(hListBox, LB_GETCURSEL, 0, 0);
if (iCurItem != LB_ERR)
SendMessage(hListBox, LB_DELETESTRING, iCurItem, 0);
else
{
MessageBox(hDlg, "Сначала надо выделить элемент списка",
"Ошибка", MB_OK);
break;
}
break;
case IDC_CHANGE_ELEMENT:
iCurItem = SendMessage(hListBox, LB_GETCURSEL, 0, 0);
if (iCurItem != LB_ERR)
SendMessage(hListBox, LB_DELETESTRING, iCurItem, 0);
else
{
MessageBox(hDlg, "Сначала надо выделить элемент списка",
"Ошибка", MB_OK);
break;
}
break;
Состояние диалогового окна при его вызове
Стандартная панель выбора файла
Состояние окна при выборе нужного файла
Состояние окна при выборе нескольких элементов
Дата добавления: 2017-01-26; просмотров: 963;