Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как передать hInstance в CALLBACK функцию, WinAPI без MFC без ресурсов 
V
    Опции темы
Belous
Дата 2.3.2016, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 8.11.2015

Репутация: нет
Всего: нет



Проект на C++ на чистом WinAPI без MFC и без использования редактора ресурсов.

По-порядку:
1. Задача: Нужно сделать окно как на рисунке с иконкой.
2. Для этого выполнены в WM_PAINT рисование белого прямоугольника и 3 надписи. 
3. Осталась иконка.
4. Но для того чтобы нарисовать иконку нужно hinst

hicon = LoadIcon(hinst, MAKEINTRESOURCE(IDI_ICON_A));

Вопрос а как ее (hinst) передать в CALLBACK функцию WndProcAbout ?


Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  Pic_002.GIF 14,02 Kb
PM MAIL   Вверх
Belous
Дата 2.3.2016, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 8.11.2015

Репутация: нет
Всего: нет



исходник


Это сообщение отредактировал(а) Belous - 31.1.2017, 16:02

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  Test_002.rar 153,65 Kb
PM MAIL   Вверх
Belous
Дата 2.3.2016, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 8.11.2015

Репутация: нет
Всего: нет



Код

// About.cpp

#include "About.h"

void About::CreateDlg(HINSTANCE hinstance)
{
    InitCommonControls();
    WNDCLASS w;
    memset(&w, 0, sizeof(WNDCLASS));
    w.cbClsExtra = 0;
    w.cbWndExtra = 0;
    w.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
    w.hCursor = LoadCursor(NULL, IDC_ARROW);
    w.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(IDI_ICON_D));
    w.hInstance = hinstance;
    w.lpfnWndProc = WndProcAbout;
    w.lpszClassName = STR_ABOUT;
    w.lpszMenuName = NULL;
    w.style = CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&w);
}

void About::ShowDlg(HWND hwnd, HINSTANCE hinstance)
{
    HWND habout;
    POINT point;
    RECT rect;
    DWORD dwStyle;
    EnableWindow(hwnd, FALSE);
    dwStyle = WS_POPUPWINDOW | WS_CAPTION;
    habout = CreateWindow(STR_ABOUT, " About", dwStyle, 0, 0, 0, 0, hwnd, NULL, hinstance, NULL);
    GetWindowRect(hwnd, &rect);
    point.x = (long) (rect.left + (rect.right - rect.left - INT_ABOUT_WIDTH) / 2);
    point.y = (long) (rect.top + (rect.bottom - rect.top - INT_ABOUT_HEIGHT) / 2);
    MoveWindow(habout, point.x, point.y, INT_ABOUT_WIDTH, INT_ABOUT_HEIGHT, FALSE);
    ShowWindow(habout, SW_SHOW);
}

About::About()
{
}

About::~About()
{
}

LRESULT CALLBACK WndProcAbout(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
    HFONT hfont;
    HPEN hpen;
    //HICON hicon;
    HDC hdc;
    PAINTSTRUCT ps;
    TEXTMETRIC tm;
    HWND hparent;
    hparent = GetParent(hwnd);
    switch (message)
    {
    case WM_CREATE:
        hdc = GetDC(hwnd);
        GetTextMetrics(hdc, &tm);
        ReleaseDC(hwnd, hdc);
        return 0;
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        hpen = (HPEN) GetStockObject(WHITE_PEN);
        SelectObject(hdc, hpen);    
        Rectangle(hdc, 0, 0, 300, 48);
        SetBkMode(hdc, TRANSPARENT);
        SetTextColor(hdc, RGB(0, 0, 0));
        hfont = GeneralCreateFont(hdc, "Times New Roman", 20, 1);
        SelectObject(hdc, hfont);
        TextOut(hdc, 55,   8, STR_ABOUT_001, strlen(STR_ABOUT_001));
        hfont = GeneralCreateFont(hdc, "Microsoft Sans Serif", 8, 0);
        SelectObject(hdc, hfont);
        TextOut(hdc, 55,  56, STR_ABOUT_002, strlen(STR_ABOUT_002));
        TextOut(hdc, 55,  80, STR_ABOUT_003, strlen(STR_ABOUT_003));
        TextOut(hdc, 55, 104, STR_ABOUT_004, strlen(STR_ABOUT_004));
        //hicon = LoadIcon(hinst, MAKEINTRESOURCE(IDI_ICON_A));
        //DrawIcon(hdc, 0, 0, hicon);
        EndPaint(hwnd, &ps);
        return 0;
    case WM_KEYDOWN:
        switch (LOWORD(wparam))
        {
        case VK_ESCAPE:
            SendMessage(hwnd, WM_CLOSE, NULL, NULL);
            break;
        default:
            break;
        }
        return 0;
    case WM_CLOSE:
        EnableWindow(hparent, TRUE);
        SetFocus(hparent);
        BringWindowToTop(hparent);
        ShowWindow(hwnd, SW_HIDE);
        DestroyWindow(hwnd);
        return 0;
    }
    return DefWindowProc(hwnd, message, wparam, lparam);
}


Добавлено через 2 минуты и 15 секунд
Код

// About.h

#include <windows.h>
#include <commctrl.h>
#include "resource.h"
#include "General.h"

#pragma comment (lib, "comctl32.lib")

#define STR_ABOUT            "AboutClass"
#define STR_ABOUT_001        "M y P r o g r a m"
#define STR_ABOUT_002        "MyProgram 1.0"
#define STR_ABOUT_003        "Freeware"
#define STR_ABOUT_004        "Copyright ©  2016  Author"
#define INT_ABOUT_WIDTH        300
#define INT_ABOUT_HEIGHT    180

class About
{
public:
    void CreateDlg(HINSTANCE hinstance);
    void ShowDlg(HWND hwnd, HINSTANCE hinstance);
    About();
    ~About();
};

LRESULT CALLBACK WndProcAbout(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);


Добавлено через 3 минуты и 17 секунд
Код

// Project.cpp

#include "Project.h"

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASS w;
    hinst = hInstance;
    memset(&w, 0, sizeof(WNDCLASS));
    w.style = CS_HREDRAW | CS_VREDRAW;
    w.lpfnWndProc = WndProc;
    w.hInstance = hInstance;
    w.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON_A));
    w.hCursor = LoadCursor(NULL, IDC_ARROW);
    w.hbrBackground    = (HBRUSH) (COLOR_BTNFACE + 1);
    w.lpszMenuName = NULL;
    w.lpszClassName = IDC_NAME;
    RegisterClass(&w);
    POINT point;
    point = form.AlignCenter(IDC_WIDTH, IDC_HEIGHT);
    hwnd = CreateWindow(IDC_NAME, IDC_NAME, WS_OVERLAPPEDWINDOW, point.x, point.y, IDC_WIDTH, IDC_HEIGHT, NULL, NULL, hInstance, NULL);
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
    while(GetMessage(&msg, NULL, 0, 0))
    {
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
    switch (message)
    {
    case WM_CREATE:
        form.CreateGeneralMenu(hwnd);
        htoolbar = form.CreateToolbar(hwnd, hinst);
        hpicturebox = form.CreatePictureBox(hwnd, hinst);
        about.CreateDlg(hinst);
    case WM_SIZE:
        form.Resize(hwnd, htoolbar, hpicturebox);
        return 0;
    case WM_COMMAND:
        switch (LOWORD(wparam))
        {
        case IDM_EXIT:
            SendMessage(hwnd, WM_CLOSE, NULL, NULL);
            break;
        case IDM_OPTIONS:
            break;
        case IDM_ABOUT:
        case IDM_START:
            about.ShowDlg(hwnd, hinst);
            break;
        }
        return 0;
    case WM_ERASEBKGND:
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, message, wparam, lparam);
}


Добавлено через 3 минуты и 54 секунды
Код

// Project.h

#include <windows.h>
#include "Form.h"
#include "About.h"

#define IDC_NAME        "Test"
#define IDC_WIDTH        800
#define IDC_HEIGHT        600

Form form;
About about;
HINSTANCE hinst;
HWND htoolbar;
HWND hpicturebox;

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);



Это сообщение отредактировал(а) Belous - 2.3.2016, 17:06
PM MAIL   Вверх
YDean
Дата 2.3.2016, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 7.9.2009

Репутация: 1
Всего: 1



можно сделать:
  • Глобальную переменную.
  • Заморочиться с w.cbWndExtra+Set/GetWindowLong - помещать значение в свойства окна после CreateWindow
  • Вызывать GetModuleHandle(NULL)

PM   Вверх
Belous
Дата 2.3.2016, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 8.11.2015

Репутация: нет
Всего: нет



Цитата

Глобальную переменную


Код

// Project.h
...
HINSTANCE hinst; // это как бы глобальная переменная


только в модуле About.cpp она как и есть и нет одновременно ??
- пробую вставить такую же hinst - ругается что дважды определение.
- не вставляю hinst - ругается что переменная не определена, почему - не понятно.

... в том то и вопрос как это сделать ?

PM MAIL   Вверх
Alexeis
Дата 3.3.2016, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Цитата(Belous @  2.3.2016,  23:25 Найти цитируемый пост)
только в модуле About.cpp она как и есть и нет одновременно ??
- пробую вставить такую же hinst - ругается что дважды определение.
- не вставляю hinst - ругается что переменная не определена, почему - не понятно.

  Определяешь однажды, в хидере описываешь ее с директивой extern . 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Belous
Дата 3.3.2016, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 8.11.2015

Репутация: нет
Всего: нет



Цитата

Определяешь однажды, в хидере описываешь ее с директивой extern

хорошо, попробую.

Но я уже сделал по-другому и все работает. В модуле About.cpp сделал переменную
Код

static HICON hicon;

присвоил ей значение там, где создается форма, а где WM_PAINT вставил только
Код

DrawIcon(hdc, 0, 0, hicon);


Всем спасибо, вопрос решен.

Это сообщение отредактировал(а) Belous - 3.3.2016, 17:44
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0717 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.