» Главная
eXcode.ru » Статьи » WinAPI
» Новости
» Опросы
» Файлы
» Журнал



Пользователей: 0
Гостей: 23





Windows и Модель-Вид-Контроллер




Обобщенная Windows программа

источник www.softcraft.ru

Эта программа использует набор базовых классов, которые инкапсулируют Windows API

* Controller (Контроллер) -- Мост между оконной процедурой и объектно-ориентированным миром.
* View (Вид) -- Инкапсулирует вывод Windows программы.
* Canvas (Холст) -- Инкапсулирует различные контексты устройств и действия, которые Вы можете сделать с их использованием.
* Model (Модель) -- Работник и мозг вашей программы. Вообще не имеет дело с Windows.

Обратите внимание: это Win32 программа -- она м.б. запущена под Windows 95, 98, NT, 2000, Me.
Обратите внимание: _set_new_handler - это специфика Microsoft. Если вы используете другой компилятор, то скорее удалите эту строку из кода. Согласно текущему стандарту C++, оператор new должен выбрасывать исключения в любом случае (VC++ сейчас тоже поддерживает стандарт. А.Л.).
Обратите внимание: Старые компиляторы могут иметь проблемы с шаблонами (Вряд ли кто использует такие старые компиляторы для программирования под Windows. А.Л.). В этом случае вы можете заменить используемые шаблоны типа Win[Get/Set]Long прямыми вызовами Get/SetWindowLong. Например, вместо вызова

Controller * pCtrl = WinGetLong<CONTROLLER *> (hwnd);

вы можете записать

Controller * pCtrl = reinterpret_cast<Controller *> (::GetWindowLong (hwnd, GWL_USERDATA));

Загрузка упакованных исходных текстов Generic (11 кб).

WinMain

При запуске WinMain, создается класс окна и главное окно нашего приложения. Я инкапсулировал эти действия внутри двух классов: WinClass и WinMaker. WinClass может также сообщать нам о том, что уже выполняются другие экземпляры нашей программы. Когда подобное случается в нашем примере, мы просто активизируем уже выполняющийся экземпляр программы и выходим из запускаемого приложения. Так необходимо поступать тогда, когда Вы хотите, чтобы в один момент времени выполнялся только один экземпляр вашей программы.

При успешном создании главного окна, мы входим в цикл обработки сообщений. Обратите внимание, что в этот раз функцией TranslateMessage обрабатываются клавиатурные сообщения. Дело в том, что наша программа имеет пункты меню, к которым можно обращаться, используя комбинации Alt+key.

Другим интересным моментом этой программы является то, что мы больше не используем строки для обозначения наших ресурсов. Мы используем числовые идентификаторы (ids). Более того, мы используем их даже тогда, когда осуществляются API вызовы таких строк, как имя класса окна или заголовок окна. Мы сохраняем все строки в строковых ресурсах и обращаемся к ним через идентификаторы (ids). Ваша среда разработки для Windows скорее всего имеет редактор ресурсов, который позволяет Вам создавать иконки, меню, строковые ресурсы и назначать им соответствующие числовые идентификаторы. Символические имена этих ids сохранены в файле заголовка, сгененрированном таким редактором. В нашем случае он назван "resource.h".

Константа, ID_MAIN, например, ссылается на иконки основной программы (большую и малую в том же самом ресурсе), главное меню, и строку с именем оконного класса. ID_CAPTION ссылается на строку заголовка окна. Такая организация данных поддерживает возможность многократного использования кода, не говоря уже о легкости локализации.



int WINAPI WinMain
(HINSTANCE hInst, HINSTANCE hPrevInst,
char * cmdParam, int cmdShow)
{
_set_new_handler (& NewHandler);

// Using exceptions here helps debugging your program
// and protects from unexpected incidents.
try
{
// Create top window class
TopWinClass topWinClass (ID_MAIN, hInst, MainWndProc);
// Is there a running instance of this program?
HWND hwndOther = topWinClass.GetRunningWindow ();
if (hwndOther != 0)
{
::SetForegroundWindow (hwndOther);
if (::IsIconic (hwndOther))
::ShowWindow (hwndOther, SW_RESTORE);
return 0;
}
topWinClass.Register ();
// Create top window
ResString caption (hInst, ID_CAPTION);
TopWinMaker topWin (topWinClass, caption);
topWin.Create ();
topWin.Show (cmdShow);
// The main message loop
MSG msg;
int status;
while ((status = ::GetMessage (&msg, 0, 0, 0)) != 0)
{
if (status == -1)
return -1;
::TranslateMessage (&msg);
::DispatchMessage (&msg);
}

return msg.wParam;
}
catch ( WinException e )
{
char buf [50];
wsprintf (buf, "%s, Error %d", e.GetMessage (), e.GetError ());
::MessageBox (0, buf, "Exception", MB_ICONEXCLAMATION | MB_OK);
}
catch (...)
{
::MessageBox (0, "Unknown", "Exception", MB_ICONEXCLAMATION | MB_OK);
}

return 0;
}


WinClass

Давайте, рассмотрим WinClass. Он инкапсулирует предопределенную в Windows структуру WNDCLASSEX и обеспечивает приемлемые значения по умолчанию для всех ее полей. Этот класс получен из более простого класса WinSimpleClass, который Вы могли бы использовать, чтобы инкапсулировать некоторые встроенные в Windows классы (такие как кнопки, списки просмотров, и т.д.).

Я обеспечил примеры методами, которые могут использоваться, чтобы перестроить значения, устанавливаемые по умолчанию. Например, SetBgSysColor изменяет заданный по умолчанию цвет заднего фона окна к одному из предопределенных цветов системы. Метод SetResIcons загружает соответствующие иконки из ресурсов и присоединяетих к оконному классу. Эти иконки затем появятся в верхнем левом углу основного окна и на панели задач Windows.

TopWinClass наследует от WinClass и использует этот метод. Он также подцепляет меню в вершине оконного класса.



class WinSimpleClass
{
public:
WinSimpleClass (char const * name, HINSTANCE hInst)
: _name (name), _hInstance (hInst)
{}
WinSimpleClass (int resId, HINSTANCE hInst);
char const * GetName () const { return _name.c_str (); }
HINSTANCE GetInstance () const { return _hInstance; }
HWND GetRunningWindow ();
protected:
HINSTANCE _hInstance;
std::string _name;
};

WinSimpleClass::WinSimpleClass (int resId, HINSTANCE hInst)
: _hInstance (hInst)
{
ResString resStr (hInst, resId);
_name = resStr;
}

HWND WinSimpleClass::GetRunningWindow ()
{
HWND hwnd = ::FindWindow (GetName (), 0);
if (::IsWindow (hwnd))
{
HWND hwndPopup = ::GetLastActivePopup (hwnd);
if (::IsWindow (hwndPopup))
hwnd = hwndPopup;
}
else
hwnd = 0;

return hwnd;
}

class WinClass: public WinSimpleClass
{
public:
WinClass (char const * className, HINSTANCE hInst, WNDPROC wndProc);
WinClass (int resId, HINSTANCE hInst, WNDPROC wndProc);
void SetBgSysColor (int sysColor)
{
_class.hbrBackground = reinterpret_cast<HBRUSH> (sysColor + 1);
}
void SetResIcons (int resId);
void Register ();
protected:
void SetDefaults ();
WNDCLASSEX _class;
};

WinClass::WinClass (char const * className,
HINSTANCE hInst, WNDPROC wndProc)
: WinSimpleClass (className, hInst)
{
_class.lpfnWndProc = wndProc;
SetDefaults ();
}

WinClass::WinClass (int resId, HINSTANCE hInst, WNDPROC wndProc)
: WinSimpleClass (resId, hInst)
{
_class.lpfnWndProc = wndProc;
SetDefaults ();
}

void WinClass::SetDefaults ()
{
// Provide reasonable default values
_class.cbSize = sizeof (WNDCLASSEX);
_class.style = 0;
_class.lpszClassName = GetName ();
_class.hInstance = GetInstance ();
_class.hIcon = 0;
_class.hIconSm = 0;
_class.lpszMenuName = 0;
_class.cbClsExtra = 0;
_class.cbWndExtra = 0;
_class.hbrBackground = reinterpret_cast<HBRUSH> (COLOR_WINDOW + 1);
_class.hCursor = ::LoadCursor (0, IDC_ARROW);
}

void WinClass::SetResIcons (int resId)
{
_class.hIcon = reinterpret_cast<HICON> (
::LoadImage (
_class.hInstance,
MAKEINTRESOURCE (resId),
IMAGE_ICON,
::GetSystemMetrics (SM_CXICON),
::GetSystemMetrics (SM_CYICON),
0));
// Small icon can be loaded from the same resource
_class.hIconSm = reinterpret_cast<HICON> (
::LoadImage (
_class.hInstance,
MAKEINTRESOURCE (resId),
IMAGE_ICON,
::GetSystemMetrics (SM_CXSMICON),
::GetSystemMetrics (SM_CYSMICON),
0));
}

void WinClass::Register ()
{
if (::RegisterClassEx (&_class) == 0)
throw WinException ("Internal error: RegisterClassEx failed.");
}

class TopWinClass: public WinClass
{
public:
TopWinClass (int resId, HINSTANCE hInst, WNDPROC wndProc);
};

TopWinClass::TopWinClass (int resId,
HINSTANCE hInst, WNDPROC wndProc)
: WinClass (resId, hInst, wndProc)
{
SetResIcons (resId);
_class.lpszMenuName = MAKEINTRESOURCE (resId);
}



После того, как оконный класс зарегистрирован системой, Вы можете создать столько окон этого класса, сколько пожелаете. Они, конечно, совместно используют ту же самую оконную процедуру, которая была зарегистрирована классом. Как будет показано дальше, мы можем различать между собой разные экземпляры окна внутри этой процедуры.
WinMaker

Класс WinMaker организован аналогично WinClass. Его конструктор устанавливает значения по умолчанию, которые могут быть переустановлены вызовом специфических методов. После завершения всех установок, Вы вызываете метод Create, чтобы создать окно, и метод Show, чтобы отобразить его. Обратите внимание, что в тот момент, когда Вы вызываете Create, ваша оконная процедура вызывается с сообщением WM_CREATE.

Верхнее окно создано с использованием класса TopWinMaker, который обеспечивает соответствующий стиль и заголовок.



class WinMaker
{
public:
WinMaker (WinClass & winClass);
operator HWND () { return _hwnd; }
void AddCaption (char const * caption)
{
_windowName = caption;
}
void AddSysMenu () { _style |= WS_SYSMENU; }
void AddVScrollBar () { _style |= WS_VSCROLL; }
void AddHScrollBar () { _style |= WS_HSCROLL; }
void Create ();
void Show (int nCmdShow = SW_SHOWNORMAL);
protected:
WinClass & _class;
HWND _hwnd;

DWORD _exStyle; // extended window style
char const * _windowName; // pointer to window name
DWORD _style; // window style
int _x; // horizontal position of window
int _y; // vertical position of window
int _width; // window width
int _height; // window height
HWND _hWndParent; // handle to parent or owner window
HMENU _hMenu; // handle to menu, or child-window id
void * _data; // pointer to window-creation data
};

WinMaker::WinMaker (WinClass & winClass)
: _hwnd (0),
_class (winClass),
_exStyle (0), // extended window style
_windowName (0), // pointer to window name
_style (WS_OVERLAPPED), // window style
_x (CW_USEDEFAULT), // horizontal position of window
_y (0), // vertical position of window
_width (CW_USEDEFAULT), // window width
_height (0), // window height
_hWndParent (0), // handle to parent or owner window
_hMenu (0), // handle to menu, or child-window id
_data (0) // pointer to window-creation data
{
}

void WinMaker::Create ()
{
_hwnd = ::CreateWindowEx (
_exStyle,
_class.GetName (),
_windowName,
_style,
_x,
_y,
_width,
_height,
_hWndParent,
_hMenu,
_class.GetInstance (),
_data);

if (_hwnd == 0)
throw WinException ("Internal error: Window Creation Failed.");
}

void WinMaker::Show (int nCmdShow)
{
::ShowWindow (_hwnd, nCmdShow);
::UpdateWindow (_hwnd);
}

// Makes top overlapped window with caption

TopWinMaker::TopWinMaker ((WinClass & winClass, char const * caption)
: WinMaker (winClass)
{
_style = WS_OVERLAPPEDWINDOW | WS_VISIBLE;
_windowName = caption;
}



Классы общего назначения

Прежде, чем идти дальше, рассмотрим некоторые простые классы общего назначения. WinException - нечто, что мы хотим использовать для исключений во время сбоев Windows API. Он заботится о восстановлении кода ошибки Windows. (Между прочим, имеется простой способ преобразовать код ошибки в строку функцией API FormatMessage.)

Класс ResString просто инкапсулирует строку, хранимую в строковых ресурсах вашего приложения.



// The exception class: stores the message and the error code
class WinException
{
public:
WinException (char* msg)
: _err (::GetLastError()), _msg(msg)
{}
DWORD GetError() const { return _err; }
char const * GetMessage () const { return _msg; }
private:
DWORD _err;
char * _msg;
};

// The out-of-memory handler: throws exception
int NewHandler (size_t size)
{
throw WinException ( "Out of memory" );
return 0;
}

class ResString
{
enum { MAX_RESSTRING = 255 };
public:
ResString (HINSTANCE hInst, int resId);
operator char const * () { return _buf; }
private:
char _buf [MAX_RESSTRING + 1];
};

ResString::ResString (HINSTANCE hInst, int resId)
{
if (!::LoadString (hInst, resId, _buf, MAX_RESSTRING + 1))
throw WinException ("Load String failed");
}



Controller

Контроллер - нервная система отдельного экземпляра окна. Он создается с этим окном, хранится с ним и, в заключение, разрушается вместе с ним. Вы можете помещать любую информацию о состоянии, имеющую отношение к специфическому экземпляру окна в его контроллер. Вообще же, контроллер содержит "Вид", который имеет дело с рисованием на поверхности окна, и он имеет доступ к "Модели", которая является мозгом вашего приложения (все это называется MVC, или образцом "Модель-Вид-Контроллер" ("Model-View-Controller"), изобретенным Smalltalk-программистами.

Если, как это часто бывает, ваше приложение имеет только одно окно верхнего уровня, Вы можете непосредственно включать модель в ее контроллер. Это упрощает управление ресурсами, но ценой усиления связи контроллера с моделью. В больших проектах нужно избегать таких связей. Предпочтительнее использовать внутри контроллера "интеллектуальный" указатель на модель.

Большинство методов контроллера требует дескриптора окна, с которым они взаимодействуют. Этот дескриптор передается с каждым сообщением Windows, но проще сохранить его один раз внутри контроллера и использовать всякий раз, когда он необходим. Помните - имеется взаимно однозначное соответствие между контроллерами и экземплярами окон (а следовательно, и их дескрипторами).



class Controller
{
public:
Controller(HWND hwnd, CREATESTRUCT * pCreate);
~Controller ();
void Size (int x, int y);
void Paint ();
void Command (int cmd);

private:

HWND _hwnd;

Model _model;
View _view;
};



Оконная процедура - основной коммутационный узел Windows приложения. Вы не вызываете ее из вашей программы - ее вызывает Windows! Каждый раз когда случается что-то интересное, Windows посылает вашей программе сообщение. Это сообщение передается оконной процедуре. Вы можете обработать его, или передать оконной процедуре, заданной по умолчанию.

Оконная процедура вызывается с указанием дескриптора к окна, к которому направлено данное сообщение. Этот дескриптор однозначно идентифицирует внутреннюю структуру данных Windows, которая соответствует экземпляру окна. Это так часто случается, что мы можем обращаться к этой структуре данных и использовать ее, чтобы сохранить некоторые специфические для экземпляра данные. Имеется типовой безопасный способ доступа к этой структуре. Между прочим, элемент GWL_USERDATA этой структуры гарантированно присутствует во всех окнах, включая окна сообщения, диалоговые окна и даже кнопки.



template <class T>
inline T WinGetLong (HWND hwnd, int which = GWL_USERDATA)
{
return reinterpret_cast<T> (::GetWindowLong (hwnd, which));
}

template <class T>
inline void WinSetLong (HWND hwnd, T value, int which = GWL_USERDATA)
{
::SetWindowLong (hwnd, which, reinterpret_cast<long> (value));
}



Каждый раз, когда Windows вызывает нашу оконную процедуру, мы хотим сначала восстановить ее контроллер. Вспомните, что может быть несколько окон, совместно использующих ту же самую оконную процедуру, и мы хотим иметь отдельный контроллер для каждого окна. Как мы узнаем, какой из контроллеров используетсять, когда произходит обратный вызов оконной процедуры? Мы можем выяснить это, рассмотрев дескриптор окна. В этом дескрипторе мы сохраняем указатель на контроллер данного окна, используя функцию Win[Set/Get]Long.

Оконная процедура сначала вызывается с сообщением WM_CREATE. В этот момент мы создаем экземпляр контроллера, нициализируем его дескриптором окна и специальной структурой данных по имени CREATESTRUCT, которая передана нам от Windows. Если же мы уже имеем контроллер, то сохраняем указатель на его в соответствующей внутренней Windows-структуре данных помеченной текущим hwnd. В следующий раз оконная процедура вызывается с сообщением, отличным от WM_CREATE, и мы просто восстанавливаем (отыскиваем) указатель на наш контроллер, используя hwnd.

Остальное просто. Оконная процедура интерпретирует параметры сообщения и вызывает соответствующие методы контроллера.



LRESULT CALLBACK WndProc
(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
Controller * pCtrl = WinGetLong<Controller *> (hwnd);

switch (message)
{
case WM_CREATE:
// Have to catch exception in case new throws!
try
{
pCtrl = new Controller (hwnd,
reinterpret_cast<CREATESTRUCT *> (lParam));
WinSetLong<Controller *> (hwnd, pCtrl);
}
catch (WinException e)
{
::MessageBox (hwnd, e.GetMessage(), "Initialization",
MB_ICONEXCLAMATION | MB_OK);
return -1;
}
catch (...)
{
::MessageBox (hwnd, "Unknown Error", "Initialization",
MB_ICONEXCLAMATION | MB_OK);
return -1;
}
return 0;
case WM_SIZE:
pCtrl->Size (LOWORD(lParam), HIWORD(lParam));
return 0;
case WM_PAINT:
pCtrl->Paint ();
return 0;
case WM_COMMAND:
pCtrl->Command (LOWORD (wParam));
return 0;
case WM_DESTROY:
WinSetLong<Controller *> (hwnd, 0);
delete pCtrl;
return 0;
}
return ::DefWindowProc (hwnd, message, wParam, lParam);
}



Ниже представлены примеры простых реализаций нескольких методов построения контроллеров. Конструктор должен помнить дескриптор окна для более позднего использования, деструктор должен посылать сообщение выхода (quit), метод Size передает его параметр Просматру (Экрану), и т.д. Мы будем говорить о рисовании в окне немного позже. Теперь, обратите внимание, что контроллер готовит поверхность "Холста" для работы "Вида".



Controller::Controller (HWND hwnd, CREATESTRUCT * pCreate)
:_hwnd (hwnd),
_model ("Generic")
{
}

Controller::~Controller ()
{
::PostQuitMessage(0);
}

void Controller::Size (int cx, int cy)
{
_view.SetSize (cx, cy);
}

void Controller::Paint ()
{
// prepare the canvas and let View do the rest
PaintCanvas canvas (_hwnd);
_view.Paint (canvas, _model);
// Notice: The destructor of PaintCanvas called automatically!
}



Когда пользователь выбирает один из пунктов меню, оконная процедура вызывается с сообщением 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<HINSTANCE> (_hwnd, GWL_HINSTANCE);
::DialogBox (hInst,
MAKEINTRESOURCE (IDD_ABOUT),
_hwnd,
AboutDlgProc);
}
break;
}
}



View, Canvas

Объект "Вид" (Экранный объект) обычно хранит размеры клиентской области. Они обновляются всякий раз, когда контроллер обрабатывает сообщение 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;
};

К началу статьи





Добавил: MadvEXДата публикации: 2005-06-03 19:10:34
Рейтинг статьи:3.00 [Голосов 5]Кол-во просмотров: 13486

Комментарии читателей

Всего комментариев: 7

2012-12-20 23:41:11
agreenhab
жесткий трах азиатки [url=http://2sexporn.ru/]порно рассказы жесткий трах[/url]
[url=http://2sexporn.ru/][img]http://2sexporn.ru/img/thumb/150867_1.jpg[/img][/url] [url=http://2sexporn.ru/][img]http://2sexporn.ru/img/thumb/181864_1.jpg[/img][/url]
жесткий трах +в чулках [url=http://2sexporn.ru/]жесткий трах сзади[/url]
[url=http://2sexporn.ru/][img]http://2sexporn.ru/img/thumb/150869_1.jpg[/img][/url] [url=http://2sexporn.ru/][img]http://2sexporn.ru/img/thumb/273094_1.jpg[/img][/url]
самый жесткий трах [url=http://2sexporn.ru/]жесткий трах огромным членом[/url]
[url=http://2sexporn.ru/][img]http://2sexporn.ru/img/thumb/149551_1.jpg[/img][/url] [url=http://2sexporn.ru/][img]http://2sexporn.ru/img/thumb/181864_1.jpg[/img][/url]
жесткий трах +в попу
жесткий трах +в общаге
жесткий трах аниме
порно жесткий трах онлайн смотреть
жесткий трах секс машинами

[url=http://finlabportal.ru/2012/05/otobrazhenie-na-grafike-v-programme-vels-lab-ryadov-dannyx/?replytocom=1867]жестокое порно трансов[/url]
[url=http://beta.purifying.info/viewtopic.php?f=2&t=2439175]порно молодых 13 лет[/url]
[url=http://forum.dkr.com.ua/member.php?28709-assiffRar]порно ретро лесби[/url]
[url=http://chi.purifying.info/viewtopic.php?f=2&t=2177627]порно фото межрасового секса[/url]
[url=http://razvedrota.ru/newreply.php?do=newreply&noquote=1&p=56457]бесплатное домашнее порно видео молодых[/url]

2012-12-18 05:18:01
nenoobjedge
смотреть клипы +с элементами порно [url=http://1xxxfreeporn.ru/]порно клип армянски[/url]
[url=http://1xxxfreeporn.ru/][img]http://1xxxfreeporn.ru/img/thumb/284714_1.jpg[/img][/url] [url=http://1xxxfreeporn.ru/][img]http://1xxxfreeporn.ru/img/thumb/181863_1.jpg[/img][/url]
капа клип порно под ракурсом [url=http://1xxxfreeporn.ru/]стриптиз порно клипы[/url]
[url=http://1xxxfreeporn.ru/][img]http://1xxxfreeporn.ru/img/thumb/181863_1.jpg[/img][/url] [url=http://1xxxfreeporn.ru/][img]http://1xxxfreeporn.ru/img/thumb/152273_1.jpg[/img][/url]
смотреть порно клипы +с конем [url=http://1xxxfreeporn.ru/]прикольные порно клипы[/url]
[url=http://1xxxfreeporn.ru/][img]http://1xxxfreeporn.ru/img/thumb/273095_1.jpg[/img][/url] [url=http://1xxxfreeporn.ru/][img]http://1xxxfreeporn.ru/img/thumb/152288_0.jpg[/img][/url]
фильмы бесплатно порно скачать клипы
порно клипы пэрис хилтон
порно фильмы порно клипы смотреть
порно клип snoop dog
порно клипы zona

[url=http://legalracing.ro/forum/viewtopic.php?p=688800#688800]порно видео маленьких лесбиянок[/url]
[url=http://im.samaradom.ru/forum/index.php?showuser=293380]порно толстые жопы смотреть бесплатно[/url]
[url=http://www.selskayazhizn.ru/newreply.php?do=newreply&noquote=1&p=488285]бесплатное любительское мега порно видео[/url]
[url=http://forum.beuky.nl/phpBB3/viewtopic.php?f=6&t=71282&p=779581#p779581]бесплатное порно с животными русское[/url]
[url=http://phpbb.idforum.org/viewtopic.php?f=2&t=770592]худая брюнетка порно фото[/url]

2012-12-13 18:07:34
twitlynut
milf pizza [url=http://antisoft.biz/user/KiriummaLorry/]порно молодых онлайн изнасилование[/url] online немецкие порно фильмы [url=http://web59ur.com/user/PheflyPeero/]ебут зрелых порно видео[/url] порно онлайн жесткая мастурбация [url=http://pornoxvid.net/user/nemnnagma/]молоденькие порно анал[/url] домашнее порно сперма на лице [url=http://www.topanal.ru/user/Cooncandy/]раздолбанный анал порно[/url] порно на немецком языке [url=http://softnovinka.ru/user/zocarhyworo/]смотреть порно супер минет[/url] бесплатное русское порно зрелые онлайн [url=http://windowos.info/user/floulmife/]смотреть порно геев в тюрьме[/url] голые девушки в чулках порно [url=http://postory.ru/index.php?subaction=userinfo&user=UttemaPhoth]куплю гей порно[/url] скачать порно молодых 3gp [url=http://tvoiwarez.ru/user/thittyHoonfen]milf hardcore[/url] посмотреть гей порно онлайн [url=http://cartoonsworld.net/user/OptivaCat/]порно видео стринги чулки[/url] блондинка саша порно [url=http://massporn.ru/user/Poomnedoche/]порно смотреть сперма бдсм[/url]

2012-11-15 18:15:24
creefsRegef
русское частное видео порно зрелых <a href=http://www.zdessex.ru/user/zrel-porn.ru/>порно зрелых женщ </a> порно фото зрелых мамаш <a href=http://www.epsoneb.ru/user/zrel-porn.ru/>порно смотреть бесплатно смотреть бесплатное порно зрелых </a> порно виде зрелых <a href=http://warez.inf5.net/user/zrel-porn.ru/>бесплатное порно зрелые училки </a> порно зрелые женщины мамки <a href=http://www.filkanet.ru/user/zrel-porn.ru/>порно видео зрелые дамы бесплатно </a> порно зрелые женщины +за 50 <a href=http://izvrashentsi.ru/user/zrel-porn.ru/>порно зрелых com </a> русское домашнее порно зрелые дамы <a href=http://gidprivat.com/user/zrel-porn.ru/>порно со зрелыми просмотр бесплатно </a> зрелые соблазняют молодых порно <a href=http://www.lefil.ru/user/zrel-porn.ru/>порно красивое со зрелыми </a> порно зрелых через торрент <a href=http://mp3hall.net/user/zrel-porn.ru/>групповое порно со зрелыми </a> домашние порно видео зрелые <a href=http://www.adultchild.ru/user/zrel-porn.ru/>порно зрелых сквирт </a> порно онлайн трахает зрелую <a href=http://online-television.net/user/zrel-porn.ru/>порно фото зрелых 50 лет </a> зрелые бляди порно онлайн <a href=http://softwz.ru/user/zrel-porn.ru/>зрелые дамы порно онлайн </a> зрелое беременное порно <a href=http://www.inadult.ru/user/zrel-porn.ru/>зрелые начальницы порно видео </a> жесткое порно видео зрелых <a href=http://www.thissex.ru/user/zrel-porn.ru/>порно онлайн русское молодые зрелые </a> порно бесплатно со зрелыми бабами <a href=http://www.euroadult.ru/user/zrel-porn.ru/>пышные зрелые женщины порно </a> бразильское порно зрелые <a href=http://seksotur.ru/user/zrel-porn.ru/>анус порно зрелые </a> реальное русское порно зрелых <a href=http://dobroe.name/user/zrel-porn.ru/>порно большие сиськи зрелых женщин </a> смотреть порно зрелых шлюх <a href=http://www.cdclear.ru/user/zrel-porn.ru/>зрелые порно актрисы </a> зрелые мамки порно фото <a href=http://natasha.ge/user/zrel-porn.ru/>парень +и зрелая женщина порно </a> зрелая заставляет порно видео <a href=http://www.teenasian.ru/user/zrel-porn.ru/>зрелую толпой порно </a>
<a href=http://gamehook.net/showthread.php?24306-Gucci-Online-Shop-25706&p=74971#post74971>порно зрелых +с мужьями </a> <a href=http://glavforum.ru/showthread.php?p=57048#post57048>порно ролики зрелые русские </a> <a href=http://muzrain.ru/news/bonfire_branded_2011/2011-02-05-906>порно жопы зрелых дам </a> <a href=http://www.mnassar.net/showthread.php?p=35927#post35927>порно фото зрелых баб </a> <a href=http://www.fahrmeierfamilyvineyards.com/index.php/en/favorite-recipes/recipe/2-artichokes-and-spinach-casserole/127-appetizers#comments>порно зрелые волосатые письки </a>

2012-10-17 20:48:09
GlyncAcenna
-Дo вcтречи! <b>секс под юбкой</b> - <a href=http://love-porn.ru/gallery/-/caa915515162649ff3b2c69dfcf5334d/index.html>под юбкой</a> Впоследствии зимних каникул Стас чистый с цепи сорвался. Коль он проходит мимо тож передаёт тетрадь, не избежать его прикосновений. Примерно нечаянно, лёгкие прикосновения к груди иначе бедру. Трудно поверить однако мня это стало соблазнять, настолько, сколько недвусмысленные переглядывания учеников перестали меня смущать. Я вдруг заметила, какие у него красивые глаза, вполне сформировавшееся крепкое тело, крупные ладони, взгляд...влюблённый. Хотелось романтики, обожания, этого чистого, невинного существа. Бедного Стаса заносило всё дальше. Он уже не пытался скрывать своих чувств, ходил изза мной точно зомби после шаманом, задерживался потом уроков в моём кабинете, дабы стереть мел с доски разве поправить стулья, провожал меня домой. Сплетня быть этом велись всесторонне невинные, мы честно пытались сохранить отношения 'учитель-ученик". Стас болтал без умолку о своей кошке и племяннице, о погоде и оценках, однако присутствие этом его глаза... Что в них было желания тоски сообразно чему то несбывшемуся покорности. Я поняла, что не смогу противостоять этому взгляду бесконечно. Я, кажется, ни болтовня не сказала о себе. Мне33 года, однако выгляжу моложе, хрупкая блондинка с огромными карими глазами и безупречной фигурой. В общем случилось то сколько надо было случится. <b>порно русское публичное посвещение студентов</b> - <a href=http://love-porn.ru/gallery/teen-upskirts-in-public/f0e5412012c7e27b91cee2b8336a2d60/?4x8x251=>порно русское публичное посвещение студентов</a>

2010-10-12 04:36:15
Vortastor
[URL=http://martinlhu.chat.ru - [IMG - http://img337.imageshack.us/img337/4229/20587939.jpg[/IMG - [/URL -
прототип коды
http://martinlhu.chat.ru/onlayn-draki-igrat/spore-patch-106-skachat.html - spore патч 1.06 скачать stalker зов припяти http://rid540lom5r.chat.ru/play-games-online-free/anachronox-windows-hr.html - anachronox windows хр hot rod скачать http://thomastay.chat.ru/top-onlayn-igr-2010/skachat-san-andreas-besplatno.html - скачать сан андреас бесплатно поиск трансформерс http://wrightbhc.chat.ru/skachat-besplatnye-igry-240h320/rapidshare-download-direct.html - Rapidshare Download Direct rage http://thomasmaf.chat.ru/besplatno-skachat-igru-spider/skachat-emulyator-sony-playstation-2.html - скачать эмулятор sony playstation 2 играть мой щенок http://hughesviy.chat.ru/onlayn-igra-zvezda/poisk-stalker.html - Поиск сталкер эпоха турниров прохождение http://phillipsmdy.chat.ru/igra-chelovek-pauk-skachat-besplatno/fleshki-igry.html - флешки игры the path http://martinezkyi.chat.ru/igrat-gaminator-besplatno-onlayn/kalov-duti-1-skachat-besplatno.html - калов дьюти 1 скачать бесплатно акацуки игры http://youngxru.chat.ru/snezhki-igra-onlayn/skachat-igru-traktorist.html - скачать игру тракторист прохождение обливион http://pattersonwbu.chat.ru/multi-games/generals-contra-007-final.html - generals contra 007 final morrowind скрины http://martinlhu.chat.ru/besplatnye-igry-shahmaty/igry-transformery.html - игры трансформеры игра метро 2033 http://rid540lom5r.chat.ru/play-hunting-games-online/obyazatelnye-film.html - обязательные фильм купить игр порно http://thomastay.chat.ru/sonic-onlayn-igrat-besplatno/skachat-no-cd-battlefront2.html - скачать no cd Battlefront2 прохождение мафии http://wrightbhc.chat.ru/skachat-besplatnye-igry-240h320/pak-russkih-mashin-dlya-gta-4.html - пак русских машин для gta 4 timeshift http://thomasmaf.chat.ru/mmorpg-2008/counter-strike-source-v51.html - counter strike source v51 игры брац http://hughesviy.chat.ru/gta-igry-onlayn/hyperballoid2timerider.html - Hyperballoid2TimeRider фантазиум обзор http://phillipsmdy.chat.ru/igrat-onlayn-linii/skachat-besplatno-igru-infamous.html - скачать бесплатно игру infamous карбон http://martinezkyi.chat.ru/smotret-film-onlayn-besplatno-igra/igra-chelovek-pauk-4-onlayn.html - игра человек паук 4 онлайн игрыдлядевачек http://youngxru.chat.ru/igry-goda-skachat-besplatno/medal-of-honor-heroes-2.html - medal of honor heroes 2 игра counter strike http://pattersonwbu.chat.ru/igry-besplatno-pro-zhivotnyh/gonki-nidforspid.html - гонки нидфорспид victoria 2

2009-12-21 12:48:42
PapaNukalau
<a href=http://vozbudi-devku.com?user_id=152><img>http://s54.radikal.ru/i143/0912/a5/af65869351e4.jpg</img></a>

<b><a href=http://vozbudi-devku.com?user_id=152>Женский аудио возбудитель</a></b>
Женский аудио возбудитель – возбудитель на основе бинауральных волн*, которые могут издавать любые аудио устройства. Был разработан группой американских и немецких ученых, Гарвардского центра медицинских наук, совместно с коллегами из Мюнхенского института медицинских наук. После многолетних исследований, ученые разработали уникальный звук, который неадекватно влияет на женщин, и вызывает бурные позывы к сексу. Вначале этот продукт был доступен только для западных потребителей, но теперь он успешно пришел и на российский рынок. Назвали его AEW - Audio exciter for women.

<b><a href=http://vozbudi-devku.com?user_id=152>Разве такое возможно?</a></b>
Да! Пояснение: дело в том, что в отличии от мужчин, у женщин на много более развито правое полушарие головного мозга – оно то, как раз и отвечает за эмоции. Из-за этого, женщины намного чувственнее, и эмоциональнее, воспринимают окружающий мир. При помощи специально разработанных, и направленных в верном направлении бинауральных волн, их правое полушарие дает команду организму: активно выделять половой гормон. В тот же момент, женщина начинает чувствовать себя в абсолютной безопасности, она расслабляется, при этом полностью теряет бдительность и контроль над собой.

<b><a href=http://vozbudi-devku.com?user_id=152>Для чего нужно такое?</a></b>
• Если у женщины пропало влечение к сексу.
• Девушка сейчас не хочет близости, но вам очень этого хочется.
• Помогает фригидным девушкам.
• В некоторых случаях вылечивает половые дисфункции.

<a href=http://vozbudi-devku.com?user_id=152><img>http://s43.radikal.ru/i102/0912/1f/3a12d4410694.jpg</img></a>
<b><a href=http://vozbudi-devku.com?user_id=152>На каких женщин это действует?</a></b>
AEW – воздействует на 98% женщин любого возраста, при этом она может даже и не знать, что вы воздействуете на нее на бинауральном уровне. Ведь наше ухо не способно их уловить, только головной мозг их слышит. По времени, полное возбуждение происходит от 3 до 8 минут, с начала прослушивания.

<b><a href=http://vozbudi-devku.com?user_id=152>Как использовать?</a></b>
Любое аудио устройство, поддерживает чистоты необходимые AEW. Вы можете включить его на компьютере, музыкальном центре, мп3-плеере, и даже на мобильном телефоне. Везде эффект будет одинаковый.

<b><a href=http://vozbudi-devku.com?user_id=152>Внимание!!!</a>
Не путайте наш продукт, с различными: цифровыми аудио стимуляторами, а так же так называемыми аудио-наркотиками. Мы ни чего общего с этим не имеем, это абсолютно разные вещи.
<a href=http://vozbudi-devku.com?user_id=152><img>http://i072.radikal.ru/0912/63/9e6a3cf4e15c.jpg</img></a>
<a href=http://vozbudi-devku.com?user_id=152>
Проверь сам </a>
</b>
Ваше имя: *
Текст записи: *
Имя:

Пароль:



Регистрация

Какой вид спорта вы предпочитаете?
Футбол
28% (61)
Баскетбол
9% (20)
Волейбол
8% (18)
Теннис
5% (10)
Легкая атлетика
2% (5)
Хоккей
5% (11)
Лыжный спорт
3% (6)
Всеми
3% (7)
Другим
18% (38)
Я не дружу со спортом!
19% (41)

Проголосовало: 217
Благодаря американской компьютеризированной системе выборов президента, тысячи российских хакеров смогли принять участие в голосовании...
Рейтинг: 9.1/10 (52)
Посмотреть все анекдоты