А. Легалов - Применение Windows API
- Название:Применение Windows API
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:2002
- Город:Красноярск
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
А. Легалов - Применение Windows API краткое содержание
Применение Windows API - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
}
Когда пользователь выбирает один из пунктов меню, оконная процедура вызывается с сообщением WM_COMMAND. Соответствующий метод контроллера посылает команду, основанную на id команды. Когда Вы создаете меню, используя редактор ресурса, Вы выбираете эти идентификаторы команд для каждого пункта меню. Они сохранены в соответствующем заголовочном файле ("resource.h" в нашем случае), который должен быть включен в исходный файл контроллера.
Наше меню содержит только три пункта с идентификаторами IDM_EXIT, IDM_HELP, и IDM_ABOUT. Диалоговое окно, которое отображается в ответ на IDM_ABOUT, также создано с использованием редактора ресурсов и имеет id IDD_ABOUT. Его процедура диалога — AboutDlgProc.
И, наконец, чтобы отобразить диалоговое окно, нам нужен дескриптор экземпляра приложения. Стандартный способ восстанавить (отыскать) его состоит в том, чтобы обратиться к внутренней структуре данных Windows, используя соответствующий hwnd.
// Menu command processing
void Controller::Command(int cmd) {
switch (cmd) {
case IDM_EXIT:
:: SendMessage(_hwnd, wm_close, 0, 0l);
break;
case IDM_HELP:
:: MessageBox(_hwnd, "go figure!", "Generic", MB_ICONINFORMATION | MB_OK);
break;
case IDM_ABOUT: {
// Instance handle is available through HWND
HINSTANCE hInst = WinGetLong(_hwnd, GWL_HINSTANCE);
:: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUT), _hwnd, AboutDlgProc);
}
break;
}
}
Объект "Вид" (Экранный объект) обычно хранит размеры клиентской области. Они обновляются всякий раз, когда контроллер обрабатывает сообщение WM_SIZE. Первое сообщение WM_SIZE посылается во время создания окна и до посылки WM_PAINT, поэтому мы можем безопасно принимать, его. Когда вызывается Paint, размерности клиентской области уже известны.
Графический вывод к окну осуществляется, вызывом соответствующих методов объекта Canvas. В нашем случае, мы печатаем текст, полученный из модели и рисуем вертикальную строку в десяти пикселах от левого края клиентской области.
class View {
public:
void SetSize(int cxNew, int cyNew) { _cx = cxNew; _cy = cyNew; }
void Paint(Canvas& canvas, Model& model);
protected:
int _cx; int _cy;
};
void View::Paint (Canvas& canvas, Model& model) {
canvas.Text(12, 1, model.GetText(), model.GetLen());
canvas.Line(10, 0, 10, _cy);
}
Объект "Холст" инкапсулирует то, что, на языке Windows, называется Контекстом устройства. Наш Холст очень прост, он знает только, как печатать текст и рисовать линии, но ваш Холст может иметь много больше методов, которые выполняют творческие функции. Мы больше расскажем о Холсте при описании одной из следующих обучающих программ.
class Canvas {
public:
operator HDC() { return _hdc; }
void Line(int x1, int y1, int x2, int y2) {
:: MoveToEx(_hdc, x1, y1, 0);
:: LineTo(_hdc, x2, y2);
}
void Text(int x, int y, char const* buf, int cBuf) {
:: TextOut(_hdc, x, y, buf, cbuf);
}
void Char(int x, int y, char c) {
:: TextOut(_hdc, x, y, &c, 1);
}
protected:
// Protected constructor: You can't construct
// a Canvas object, but you may be able
// to construct objects derived from it.
Canvas(HDC hdc): _hdc (hdc) {}
HDC _hdc;
};
Холсты, который Вы создаете, в ответ на сообщение WM_PAINT, имеет специальный вид. Они получают контекст устройства, вызывая BeginPaintи отдают его, вызывая EndPaint. PAINTSTRUCT содержит дополнительную информацию, о некоторой части рабочей области, которая должна быть перерисована, и т.д. Пока мы игнорируем некоторые подробности, но если вы серьезно относитесь к эффективности, Вы должны изучить это более детально.
// Concrete example of canvas.
// Create this object after WM_PAINT message
class PaintCanvas: public Canvas{
public:
// Constructor obtains the DC
PaintCanvas(HWND hwnd) : Canvas (:: BeginPaint(hwnd, &_paint)), _hwnd (hwnd) {}
// Destructor releases the DC
~PaintCanvas () {
:: EndPaint(_hwnd, &_paint);
}
protected:
PAINTSTRUCT _paint;
HWND _hwnd;
};
Далее:Разве можно программировать в Windows без использования элементов управления?
Классовая обертка для элементов управления
Перевод А. И. Легалова
Англоязычный оригинал находится на сервере компании Reliable Software
Элементы управления могут быть добавлены к основному окну или к любому диалоговому окну вашей программы. Их лучше всего выбрать и позиционировать, используя графический редактор ресурсов. Такой редактор позволяет задавать символические имена, которые можно использовать для идентификации элементов управления.
Большинство средств управления можно инкапсулировать в объектах, которые внедрены или в соответствующий "Контроллер" (Вы можете иметь отдельные объекты Controller для каждого диалогового окна программы), или, для статических элементов управления, в "Виде".
Объекты — "Контроллеры" создаются при обработке сообщения WM_CREATE или, в случае диалоговых окон, сообщением WM_INITDIALOG. При этом выполняются конструкторы элементов управления, внедренных в эти "Контроллеры".
Базовым классом для большинства элементов управления является SimpleControl. Он получает и сохраняет дескриптор окна специфического элемента управления. Чтобы получить этот дескриптор, необходимо иметь дескриптор родительского окна и идентификатор элемента управления.
class SimpleControl{
public:
SimpleControl(HWND hwndParent, int id) : _hWnd( GetDlgItem(hwndParent, id)) {}
void SetFocus() {
::SetFocus(_hwnd);
}
HWND Hwnd() const { return _hWnd; }
protected:
HWND _hWnd;
};
Ниже представлен пример элемента управления редактированием.
class Edit: public SimpleControl{
public:
Edit(HWND hwndParent, int id) : SimpleControl (hwndParent, id) {}
void SetString(char* buf) {
SendMessage(Hwnd(), WM_SETTEXT, 0, (LPARAM)buf);
}
// code is the HIWORD (wParam)
static BOOL IsChanged (int code) {
return code == EN_CHANGE;
}
int GetLen() {
return SendMessage(Hwnd(), WM_GETTEXTLENGTH, 0, 0);
}
void GetString(char* buf, int len) {
SendMessage(Hwnd(), WM_GETTEXT, (WPARAM)len, (LPARAM)buf);
}
void Select() {
SendMessage(Hwnd(), EM_SETSEL, 0, –1);
}
};
Здесь показано, как элемент управления редактированим может использоваться:
class Controller{
public:
Controller(HWND hwnd);
…
private:
Edit _edit;
char _string[maxLen];
};
Controller::Controller(HWND hwnd) : _edit(hwnd, IDC_EDIT) {
_edit.SetFocus();
…
}
void Controller::Command(HWND hwnd, WPARAM wParam, LPARAM lParam) {
switch (LOWORD(wParam)) {
case IDC_EDIT:
Интервал:
Закладка: