Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

WIN32 API (без MFC)

6.8K
06 апреля 2007 года
Аццкий программер
91 / / 27.11.2006
дайте плз ссылочку на хорошую статейку по теме создания оконных приложений win api (желательно с иллюстрациями для идиотов :)
4.5K
06 апреля 2007 года
e-XperT
127 / / 04.07.2006
firststeps.ru
26K
06 апреля 2007 года
Atomic
8 / / 06.04.2007
Справочников и учебников по WinAPi море в инете. Надо только поискать :) А что насчет иллюстрации:

Вот собственно очень маленькая программа выводящая сообщения о нажатиях клавиш в элемент окна.

1. Создаем окно в редакторе ресурсов (обзываем его например IDD_MAINWINDOW как в моем примере ниже.
2. Cоздаем в нем элемент StaticText IDC_KEYMSG (контрол тоесть)


Код:
#include "stdafx.h"
#include "resource.h"

// Функция главного окна -----------------------------
BOOL CALLBACK   WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR    lpCmdLine,
                     int       nCmdShow)
{
// создаем наше окошко.

    HWND    hWnd= CreateDialog(hInstance,LPCTSTR(IDD_MAINWINDOW),0,WndProc);
            ShowWindow(hWnd,SW_SHOW);

    // Main message loop:--------------------
    MSG msg;
   
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
        if(msg.message==WM_CHAR){
            msg.hwnd=hWnd;
            DispatchMessage(&msg);}
//тут мы дублируем сообщения о нажатиях клавиш главному окну чтобы обработать их.
    }

    return (int) msg.wParam;
}

// собственно функция нашего окошка. К ней система обращается
//когда что-то происходит, тоесть нашему окошку приходит сообщение.
// вот эти сообщения мы и обрабатываем тут.
// в данном примере - когда поступает сообщение о нажатиях клавиши (WM_CHAR)
//мы выводим строку в элемент окна  IDC_KEYMSG
//где пишем какая клавиша была нажата и даже ее код.

BOOL CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
char keymessage[]="Клавиша - _ а ее код ___";

    switch (message)
    {
    case WM_INITDIALOG: // такое сообщение приходит 1 раз после создания нашего окошка.

        SetDlgItemText(hWnd,IDC_KEYMSG,(LPCTSTR)keymessage);
        UpdateWindow(hWnd);
        break;

    case WM_CHAR:  // если пришло такое сообщение значит нам сюда.

// wParam содержит код нажатого символа. Вставляем его в строку.
        keymessage[10]=(BYTE)wParam;                   
// код символа также  вставляем в строку
        _itoa((BYTE)wParam,&keymessage[21],10);
//если двухзначный код затраем 3й символ
        if ((BYTE)wParam < 100) keymessage[23]=0;
//если однозначный то  затираем также 2ой
        if ((BYTE)wParam < 10) keymessage[22]=0;
//выводим текст в элемент окна IDC_KEYMSG (static text)
        SetDlgItemText(hWnd,IDC_KEYMSG,(LPCTSTR)keymessage);
        break;
    case WM_PAINT:
        break;
    case WM_CLOSE: // если окно пытаются закрыть - нам сюда.

        DestroyWindow(hWnd);
        PostQuitMessage(0);
        break;
    }
    return false;
}


вот и все. Здоровый код без всяких хлопот. Я знаю все учебники по Winapi начинаются с CreateWindow
но помоему это просто лишнее забивание мозгов. Нет ничего такого чего нельзя было-бы сделать через диалоговое

окно. А гемора и кода куда меньше.
Единственное - понимание CreateWindow поможет лучше понять принципы... Просто чтобы новичка не запугал этот гемор с созданием окно сразу привел более компактное решение.
3
07 апреля 2007 года
Green
4.8K / / 20.01.2000
Цитата: Atomic
Нет ничего такого чего нельзя было-бы сделать через диалоговое окно.


И нестандартный контрол ты тоже делаешь через диалоговое окно? :)

26K
07 апреля 2007 года
Atomic
8 / / 06.04.2007
Цитата: Green
И нестандартный контрол ты тоже делаешь через диалоговое окно? :)



Ты про Custom Contol ? дык вроде он в редакторе тоже есть. Вообще таким не занимался пока. Но думаю можно скорее всего. Лазейка всегда найдется :) Получать хендлеры каждого элемента диалога можно.. и можно с ними работать так как если-бы ты создал через CreateWindow. Не пойму в чем проблема ? :) Можно впендюрить в диалоговое окно свой элемент на ходу в конце концов.

CreateDialog вызывает CreateWindowEx. ЕДИНСТВЕННОЕ различие только в том что вместо того чтобы ручками набивать элементы мы их красиво расставляем в редакторе. После чего CreateDialog передает эти параметры CreateWindow фукциям. После этого можно с окном работать точно так-же как если-бы создали через CreateWindowEx. Причем с элементами можно работать как через диалоговые функции (SendDlgItemMessage) так и через обычные, предварительно получив HWND нужного элемента функцией GetDlgItem. Со всеми вытекающими. Подмена процедуры итд. (если это требуется) SetWindowLongPtr(hWnd,GWLP_WNDPROC)

3
07 апреля 2007 года
Green
4.8K / / 20.01.2000
Контрол - это и есть окно. Для того, чтобы создавать контролы надо бы научиться создавать окна.
А интерфейс на базе одних диалогов - это убого и напоминает множество горе-интерфейсов клепаемых на Delphi и C++Builder.
26K
07 апреля 2007 года
Atomic
8 / / 06.04.2007
Цитата: Green
Контрол - это и есть окно. Для того, чтобы создавать контролы надо бы научиться создавать окна.
А интерфейс на базе одних диалогов - это убого и напоминает множество горе-интерфейсов клепаемых на Delphi и C++Builder.



Ну пока на практике мне не пришлось извращатся с окнами... типа динамически создаваемый интерфейс и всякие там заморочки с контролами. я умею через CreateWindows делать но никогда не делаю - потому что через редактор ресурсов оно быстрее меньше писать и нагляднее... А какую-либо нестандартность я могу доделать в коде (при инциализации диалога прописываю все что мне нужно в разные контролы, чего не позволяет редактор). А то что CreateWindows полезно знать я упомянул. :) Я вот ща пытаюсь также научиться под MFC писать.. ну впринципе получается.. но блин привыкнуть сложно... Ну лан сорри за оффтоп :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог