Главная » WPF » Библиотека User32 в стиле книги Чарльза  Петцольда

0

Всякий, кто программировал на уровне  User32, наверняка читал какую#то из книг Чарльза Петцольда  «Программирование в Windows». Все они начинаются примерно  с такого примера:

#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,

WPARAM wparam, LPARAM lparam);

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdline, int cmdshow) {

MSG msg; HWND hwnd;

WNDCLASSEX wndclass = { 0 }; wndclass.cbSize = sizeof(WNDCLASSEX); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc;

wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszClassName = TEXT(«Window1»);

wndclass.hInstance = hInstance;

wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); RegisterClassEx(&wndclass);

hwnd = CreateWindow(TEXT(«Window1»), TEXT(«Hello World»), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,

0,

CW_USEDEFAULT,

0, NULL, NULL,

hInstance, NULL);

if( !hwnd )

return 0;

ShowWindow(hwnd, SW_SHOWNORMAL); UpdateWindow(hwnd);

while( GetMessage(&msg, NULL, 0, 0) ) { TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {

switch(msg) {

case WM_DESTROY: PostQuitMessage(WM_QUIT); break;

default:

return DefWindowProc(hwnd, msg, wparam, lparam);

}

return 0;

}

Это вариант  программы  «Здравствуй, мир» на языке  User32. В ней происхо# дит немало  интересного.  Сначала  путем обращения  в функции RegisterClassEx определяется специализированный тип (Window1), затем создается (Create Window) и отображается (ShowWindow) экземпляр этого типа. В конце запуска# ется цикл обработки сообщений, в котором окно получает данные от пользовате# ля и события от системы (GetMessage, TranslateMessage и Dispatch Message). Эта программа не претерпела  существенных изменений со времен появления библи# отеки User в системе Windows 1.0.

На основе этой сложной модели в Windows Forms была создана ясная управ# ляемая  объектная  модель, для которой программировать гораздо проще. Так, программа «Здравствуй, мир» в Windows Forms занимает всего 10 строк:

using System.Windows.Forms;

using System;

class Program { [STAThread]

static void Main() { Form f = new Form(); f.Text = «Hello World»;

Application.Run(f);

}

}

Основная цель WPF – по возможности не отбрасывать те знания, которые уже на# копили разработчики. Хотя как презентационная система WPF очень сильно отлича# ется кардинально от Windows Forms, но эквивалентная программа оказывается очень похожа1 (отличающиеся строки в коде ниже выделены полужирным шрифтом):

using System.Windows;

using System;

class Program { [STAThread]

static void Main() { Window f = new Window(); f.Title = «Hello World»; new Application().Run(f);

}

}

В обоих случаях вызов метода Run объекта Application  служит заменой циклу обработки сообщений, а для определения экземпляров и типов применяется стандартная система  типов  CLR  (общеязыковой среды  исполнения). Windows Forms – это, по существу, управляемый слой поверх User32, а потому он ограни# чен базовыми  возможностями, предоставляемыми этой библиотекой.

User32 – великолепная платформа для создания двумерных элементов управ# ления. Она основана на системе рисования по запросу, с отсечением. Иными сло# вами, когда нужно нарисовать  элемент, система обращается к пользовательскому коду (посылает запрос)  с требованием  выполнить рисование  в охватывающем прямоугольнике, который  сама защищает  (реализует отсечение).  Особенностью систем рисования с отсечением является высокое быстродействие;  на буфериза# цию содержимого  элемента не расходуется память, а на рисование чего#либо кро# ме самого изменившегося элемента не тратится  процессорное  время.

Минусы таких систем связаны, главным образом, со временем реакции и ком# позицией.  Поскольку система должна просить пользовательскую программу вы# полнять  все операции  рисования,  то, пока рисуется  один компонент,  остальным приходится  ждать. Эта проблема наглядно проявляется в Windows,  когда прило# жение зависает, и его окно становится белым, или когда оно рисует некорректно. Кроме того, очень трудно добиться того, чтобы на один и тот же пиксель воздей# ствовали два компонента,  а между тем такая возможность часто требуется – нап# ример, для реализации полупрозрачности, сглаживания (anti#aliasing) и теней.

Недостатки Windows Forms становятся очевидными, когда несколько элемен# тов управления перекрываются (рис. 1.1). В этом случае система должна выпол# нить отсечение для каждого элемента. Обратите  внимание на серую область вок# руг слова linkLabel1  на рисунке.

Рис. 1.6. Вся мощь композиции раскрывается при увеличении кнопки.

Источник: К. Андерсон  Основы  Windows Presentation Foundation. Пер. с англ. А. Слинкина — М.: ДМК Пресс, 2008 — 432 с.: ил.

По теме:

  • Комментарии