Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 12.09.2012, 16:01   #1
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,252
По умолчанию Создание GUI на WinAPI

Эта тема с демонстрационными примерами. Каждый пример показывает использование одного или
нескольких элементов GUI, взаимодействие с этими элементами или взаимодействие элементов между собой.

Я рассматриваю наиболее востребованные функции элементов пользовательского интерфейса. В
соответствии с возможностями редактора ResEdit http://www.resedit.net

Animation
Button
CheckBox
ComboBox
Custom Control
Date Time Picker
Edit Control
Group Box
Hot Key
IP Address Control
ListBox
ListView Control
Month Calendar
Picture Control
Progress Bar
Radio Button
Rebar Control
Rich Edit 2
Scroll Bar
Slider Control
Spin Control
Static Text
Tab Control
TreeView Control

Диалоговые окна буду оформлять в соответствии с примером из уроков Iczelion'а:
http://www.programmersforum.ru/showp...50&postcount=9

Преследую несколько целей:
- хочу увидеть недочёты в демо-программах при помощи более опытных программистов
- хочу составить справку на основе материала этой темы (либо тема будет, своего
рода, справкой)
- хочу чтобы эта тема была полезна людям

Итак, поехали! Один раз опишу, как я создаю проекты, чтобы не забывать.

Создаём проект в Visual 2008 Express Edition (IDE распространяется бесплатно):

- Файл --> Создать (Ctrl+N) --> Тип проекта: Win32 --> Шаблоны: Win32 --> Вводим имя, например: simple_edit -->
--> Выбираем расположение --> Убираем галочку "Создать каталог для решения" --> Нажимаем "Ok"

- Выбираем "Параметры приложения" --> Ставим галочку "Пустой проект" --> Нажимаем "Готово"

- В меню выбираем "Проект" --> "Добавить новый элемент" (Ctrl+Shift+A) --> Можно сразу
написать имя "main.c" (вне зависимости от выбранного шаблона) --> Нажимаем: "Добавить"

Создаём диалоговое окно с элементом управления Edit в
ResEdit
(http://www.resedit.net, распространяется бесплатно):

- File --> New project --> Выбираем расположение (там где находится main.c) --> Вводим
имя файла, например: simple_edit --> Нажимаем "Сохранить"

- File --> Add a resource --> Dialog (Ctrl+D)

- Удаляем кнопки, добавленные по умолчанию: "Ок" и "Cancel"

- Выделяем окно "Dialog" --> Cлева в панели "Properties" выбираем поле "Caption" (или
начинаем вводить слово "caption" в поле "Enter search here" панели "Properties") и
меняем заголовок окна с "Dialog" на "Simple Edit"

- Справа в панели "Toolbox" кликаем на поле "Edit Control" --> Кликаем на клиентской области
нашего окна --> Кликаем по кнопкам "Vertically center" и "Horizontally center" панели инструменов

- File --> Save (Ctrl+S)

Запуск приложения:
- В меню выбираем "Проект" --> "Существующий элемент" (Ctrl+Alt+A) --> Выбираем файл
с расширением .rc (в нашем случае это "simple_edit.rc") --> Нажимаем "Добавить"
- Копируем следующий код в файл "main.c"
Код:
#include <windows.h>
#include <tchar.h>

#define IDD_DIALOG1 100

INT_PTR CALLBACK DialogProc(HWND hwndDlg,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam);

LPCTSTR DlgName = MAKEINTRESOURCE(IDD_DIALOG1);

int WINAPI _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR lpCmdLine,
                     int nCmdShow)
{
    DialogBoxParam(hInstance, DlgName, NULL, DialogProc, (LPARAM) NULL);

    return TRUE;
}

INT_PTR CALLBACK DialogProc(HWND hWnd,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam)
{
    switch(uMsg) {
    case WM_CLOSE:
        EndDialog(hWnd, 0);
        break;
    default:
        return FALSE;
    }

    return TRUE;
}
- В меню выбираем "Построение" --> "Построить решение" (F7)
- В меню выбираем "Отладка" --> "Запуск без отладки" (Ctrl+F5)

Edit Control на диалоговом окне:
8Observer8 вне форума Ответить с цитированием
Старый 12.09.2012, 16:04   #2
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,252
По умолчанию

Button на диалоговом окне:


Код:
#include <windows.h>
#include <tchar.h>

#define IDD_DIALOG1 100

INT_PTR CALLBACK DialogProc(HWND hwndDlg,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam);

LPCTSTR DlgName = MAKEINTRESOURCE(IDD_DIALOG1);

int WINAPI _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR lpCmdLine,
                     int nCmdShow)
{
    DialogBoxParam(hInstance, DlgName, NULL, DialogProc, (LPARAM) NULL);

    return TRUE;
}

INT_PTR CALLBACK DialogProc(HWND hWnd,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam)
{
    switch(uMsg) {
    case WM_CLOSE:
        EndDialog(hWnd, 0);
        break;
    default:
        return FALSE;
    }

    return TRUE;
}

Последний раз редактировалось 8Observer8; 12.09.2012 в 16:07.
8Observer8 вне форума Ответить с цитированием
Старый 12.09.2012, 16:09   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,252
По умолчанию

Записываем строку в Edit:


Код:
#include <windows.h>
#include <tchar.h>

#define IDD_DIALOG1    100

INT_PTR CALLBACK DialogProc(HWND hwndDlg,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam);

LPCTSTR DlgName = MAKEINTRESOURCE(IDD_DIALOG1);

int WINAPI _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR lpCmdLine,
                     int nCmdShow)
{
    DialogBoxParam(hInstance, DlgName, NULL, DialogProc, (LPARAM) NULL);

    return TRUE;
}

#define IDC_EDIT1      3000
#define IDC_BUTTON1    3001

LPCTSTR TestString = _T("Hello!");

INT_PTR CALLBACK DialogProc(HWND hWnd,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam)
{
    switch(uMsg) {
    case WM_COMMAND:
        if (LOWORD(wParam) == IDC_BUTTON1) {
            SetDlgItemText(hWnd, IDC_EDIT1, TestString);
        }
        break;
    case WM_CLOSE:
        EndDialog(hWnd, 0);
        break;
    default:
        return FALSE;
    }

    return TRUE;
}
Примечание. В файлах "main.c" и "*.rc" нужно определить:
#define IDC_EDIT1 3000
#define IDC_BUTTON1 3001
8Observer8 вне форума Ответить с цитированием
Старый 12.09.2012, 16:11   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,252
По умолчанию

Считываем строку из Edit'а:


Код:
#include <windows.h>
#include <tchar.h>

#define IDD_DIALOG1    100

INT_PTR CALLBACK DialogProc(HWND hwndDlg,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam);

LPCTSTR DlgName = MAKEINTRESOURCE(IDD_DIALOG1);

int WINAPI _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR lpCmdLine,
                     int nCmdShow)
{
    DialogBoxParam(hInstance, DlgName, NULL, DialogProc, (LPARAM) NULL);

    return TRUE;
}

#define IDC_EDIT1      3000
#define IDC_BUTTON1    3001
#define BSIZE          512

LPCTSTR TestString = _T("Hello!");
TCHAR buf[BSIZE];

INT_PTR CALLBACK DialogProc(HWND hWnd,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam)
{
    switch(uMsg) {
    case WM_INITDIALOG:
        SetDlgItemText(hWnd, IDC_EDIT1, TestString);
        break;
    case WM_COMMAND:
        if (LOWORD(wParam) == IDC_BUTTON1) {
            GetDlgItemText(hWnd, IDC_EDIT1, buf, BSIZE);
            MessageBox(NULL, buf, _T("Text"), MB_OK);
        }
        break;
    case WM_CLOSE:
        EndDialog(hWnd, 0);
        break;
    default:
        return FALSE;
    }

    return TRUE;
}
Примечание. В файлах "main.c" и "*.rc" нужно определить:
#define IDC_EDIT1 3000
#define IDC_BUTTON1 3001
8Observer8 вне форума Ответить с цитированием
Старый 12.09.2012, 16:12   #5
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,252
По умолчанию

Считываем строку из Edit'а:


Код:
#include <windows.h>
#include <tchar.h>

#define IDD_DIALOG1    100

INT_PTR CALLBACK DialogProc(HWND hwndDlg,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam);

LPCTSTR DlgName = MAKEINTRESOURCE(IDD_DIALOG1);

int WINAPI _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR lpCmdLine,
                     int nCmdShow)
{
    DialogBoxParam(hInstance, DlgName, NULL, DialogProc, (LPARAM) NULL);

    return TRUE;
}

#define IDC_EDIT1      3000
#define IDC_BUTTON1    3001
#define BSIZE          512

LPCTSTR TestString = _T("Hello!");
TCHAR buf[BSIZE];

INT_PTR CALLBACK DialogProc(HWND hWnd,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam)
{
    switch(uMsg) {
    case WM_INITDIALOG:
        SetDlgItemText(hWnd, IDC_EDIT1, TestString);
        break;
    case WM_COMMAND:
        if (LOWORD(wParam) == IDC_BUTTON1) {
            GetDlgItemText(hWnd, IDC_EDIT1, buf, BSIZE);
            MessageBox(NULL, buf, _T("Text"), MB_OK);
        }
        break;
    case WM_CLOSE:
        EndDialog(hWnd, 0);
        break;
    default:
        return FALSE;
    }

    return TRUE;
}
Примечание. В файлах "main.c" и "*.rc" нужно определить:
#define IDC_EDIT1 3000
#define IDC_BUTTON1 3001
8Observer8 вне форума Ответить с цитированием
Старый 14.09.2012, 23:01   #7
pavelnt
 
Регистрация: 01.09.2011
Сообщений: 5
По умолчанию

Очень позновательно, спасибо! А когда будет продолжение?
Справка с примерами по работе со всеми контролами на Win32 API была бы очень полезна.

Последний раз редактировалось pavelnt; 14.09.2012 в 23:04. Причина: Добавление
pavelnt вне форума Ответить с цитированием
Старый 15.09.2012, 15:52   #8
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,252
По умолчанию

Цитата:
Сообщение от pavelnt Посмотреть сообщение
Очень познавательно, спасибо! А когда будет продолжение?
Справка с примерами по работе со всеми контролами на Win32 API была бы очень полезна.
Очень рад! Если хотя бы одному человеку интересно, значит не зря пишу! Я думаю, позже найдётся ещё больше людей, которым справка с примерами будет полезна. Я немного остановлюсь на Edit'e. Предупрежу, что иногда я намерен возвращаться к рассмотренным контролам и приводить дополнительные примеры. Время от времени я буду писать "Предварительное содержание" поэтому неважно сколько сообщений было связано не с примерами, а с обсуждением моих недочётов (или с улучшением примеров). Пусть их будет даже больше ста, нас будет спасать "Предварительное содержание". Так же пишите, что именно нужно продемонстрировать дополнительно (например, какое-нибудь полезное взаимодействие контролов) - это внесёт вклад и в мою копилку знаний.
8Observer8 вне форума Ответить с цитированием
Старый 15.09.2012, 15:57   #9
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,120
По умолчанию

Так же пишите, что именно нужно продемонстрировать дополнительно

что-нибудь посвежее чем со времен динозавров((:
например Ribbons, Win8 Transitions, ...
Rififi вне форума Ответить с цитированием
Старый 15.09.2012, 16:10   #10
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,252
По умолчанию

Обмен данными между Edit'ами


Краткое описание:
После нажатия на кнопку "Change" содержимое двух Edit'ов меняется местами.

Замечание:
Edit'ы настроены только на чтение (для этого в редакторе ресурсов выделяем оба Edit'а --> на панели "Properties" в поле "Enter search here" начинаем вводить "read" --> выбираем в поле "Read Only" значение "True")

Код:

#include <windows.h>
#include <tchar.h>

#define IDD_DIALOG1    100

INT_PTR CALLBACK DialogProc(HWND hwndDlg,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam);

LPCTSTR DlgName = MAKEINTRESOURCE(IDD_DIALOG1);

int WINAPI _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR lpCmdLine,
                     int nCmdShow)
{
    DialogBoxParam(hInstance, DlgName, NULL, DialogProc, (LPARAM) NULL);

    return TRUE;
}

#define IDC_EDIT1      3000
#define IDC_EDIT2      3001
#define IDC_BUTTON1    3002

LPCTSTR TestString1 = _T("123");
LPCTSTR TestString2 = _T("abc");

INT_PTR CALLBACK DialogProc(HWND hWnd,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam)
{
    static int flag;

    switch(uMsg) {
    case WM_INITDIALOG:
        SetDlgItemText(hWnd, IDC_EDIT1, TestString1);
        SetDlgItemText(hWnd, IDC_EDIT2, TestString2);
        break;
    case WM_COMMAND:
        if (LOWORD(wParam) == IDC_BUTTON1) {
            if (flag) {
                SetDlgItemText(hWnd, IDC_EDIT1, TestString1);
                SetDlgItemText(hWnd, IDC_EDIT2, TestString2);
            }
            else {
                SetDlgItemText(hWnd, IDC_EDIT1, TestString2);
                SetDlgItemText(hWnd, IDC_EDIT2, TestString1);
            }
            flag ^= 1;
        }
        break;
    case WM_CLOSE:
        EndDialog(hWnd, 0);
        break;
    default:
        return FALSE;
    }

    return TRUE;
}
Примечание. В файлах "main.c" и "*.rc" нужно определить:
Код:
#define IDC_EDIT1      3000
#define IDC_EDIT2      3001
#define IDC_BUTTON1    3002
8Observer8 вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Различия WinAPI и создание оконных приложений VS Studio Sauber Общие вопросы C/C++ 13 03.07.2012 18:21
Создание окна(asm) с использованием WinApi Alex1991 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 04.04.2011 12:20
Создание GUI в DirectX Selestis Gamedev - cоздание игр: Unity, OpenGL, DirectX 11 02.08.2010 14:15
Создание сложных объектов в gui cherw9!40k Общие вопросы по Java, Java SE, Kotlin 0 22.03.2010 22:02
Создание GUI для WINDOWS inzener-tolik Помощь студентам 8 13.03.2010 11:39


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840