Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2018, 14:56   #21
ИвановБ
Пользователь
 
Регистрация: 19.12.2016
Сообщений: 70
По умолчанию

Вы дает ошибки вот какие
Цитата:
error C2059: синтаксическая ошибка: константа
error C2065: g_hInstance: необъявленный идентификатор
error C2065: IDM_GOTO: необъявленный идентификатор
error C2065: hwndGoto: необъявленный идентификатор
error C2065: hwndGoto: необъявленный идентификатор
error C2065: hInstance: необъявленный идентификатор
error C2065: GoToProc: необъявленный идентификатор
error C2065: hwndGoto: необъявленный идентификатор
error C2065: nShowCmd: необъявленный идентификатор
warning C4060: оператор switch не содержит метку 'case' или 'default'
error C2065: g_hInstance: необъявленный идентификатор
Необъявленный идентификатор понятно что за ошибка, но как их объявить? И почему ошибка выдает и на g_hInstance хотя до этого было нормально.
ИвановБ вне форума Ответить с цитированием
Старый 03.05.2018, 15:21   #22
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,694
По умолчанию

Т.е. вы даже не пытаетесь разобраться, а тупо копипастите код...

Цитата:
Сообщение от ИвановБ Посмотреть сообщение
error C2065: g_hInstance: необъявленный идентификатор
Проверяйте, где-то накосячили. Ну или выкладывайте весь код.

Цитата:
error C2065: IDM_GOTO: необъявленный идентификатор
Цитата:
The statements in the first part of the example create the modeless dialog box. These statements, in the window procedure for the application's main window, create the dialog box when the window procedure receives a WM_COMMAND message having the IDM_GOTO menu identifier, but only if the global variable does not already contain a valid handle.
Если вы не осилили виндовую систему сообщений, то лучше возьмите qt, sdl или другую либу, где это уже сделано за вас.

Цитата:
error C2065: hwndGoto: необъявленный идентификатор
Код:
HWND hwndGoto = NULL;  // Window handle of dialog box
Цитата:
error C2065: hInstance: необъявленный идентификатор
Там же уже нет hInstance, вы же для этого его сохраняете в глобальную переменную...

Цитата:
error C2065: GoToProc: необъявленный идентификатор
Цитата:
lpDialogFunc [in, optional]
Type: DLGPROC

A pointer to the dialog box procedure. For more information about the dialog box procedure, see DialogProc.
И кто ее по вашему должен объявлять и реализовывать?

Цитата:
error C2065: nShowCmd: необъявленный идентификатор
Ну если вы скопировали откуда-то шаблон, хотя в примере константа задана явно
Код:
ShowWindow(hwndGoto, SW_SHOW);
то и обеспечьте объявление и значение нужное вам.

Цитата:
warning C4060: оператор switch не содержит метку 'case' или 'default'
Скорее всего где-то с скобками или запятами/точками с запятыми налажали, вот и g_hInstance пропал.
p51x вне форума Ответить с цитированием
Старый 03.05.2018, 15:41   #23
ИвановБ
Пользователь
 
Регистрация: 19.12.2016
Сообщений: 70
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Цитата:
Сообщение от ИвановБ
error C2065: g_hInstance: необъявленный идентификатор
Проверяйте, где-то накосячили. Ну или выкладывайте весь код.
Убираю подключение ресурсного файла ошибка уходит.

Вот основной код
Код:
// Подключаем библиотеки Windows для Win32
#include <windows.h>
#include <CommCtrl.h>
#pragma comment(lib, "Comctl32")
#include "resource.h" 

#define ID_LISTVIEW 1001

HINSTANCE g_hInstance;
HWND g_hMainWnd;
HWND g_hListView;

// Объявляем прототип CALLBACK функции
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
BOOL ListViewCreate(HWND hParent);
BOOL ListViewAddItem(char* pCol1, char* pCol2);
VOID ListViewResize();
 
// Функция WinAPI для точки входа в программу
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    g_hInstance = hInstance;
    // Регистрация класса окна
    // Объявляем переменную типа WNDCLASSEX
 
    WNDCLASSEX wClass; 
    ZeroMemory(&wClass, sizeof(WNDCLASSEX)); // Обнуляем память
    // Заполняем структуру WNDCLASSEX
    wClass.cbSize = sizeof(WNDCLASSEX); // Размер равен размеру структуры
    wClass.hbrBackground = (HBRUSH)COLOR_WINDOW; // Определяем фон окна
    wClass.hInstance = hInstance; // hInstance window
    wClass.lpfnWndProc = (WNDPROC)WndProc; // Процедура обработки окна
    wClass.lpszClassName = "Athlete"; // Имя класса
 
    // Если произошла ошибка, то выводим сообщение
    if (!RegisterClassEx(&wClass))
    {
        int nResult = GetLastError();
        MessageBox(NULL, "Класс окна не был создан!", "Ошибка", MB_ICONERROR);
    }
 
    // Создаем окно при помощи функции WinApi CreateWindowEx
    g_hMainWnd = CreateWindowEx(NULL,
        "Athlete", // Имя класса, который мы определили ранее
        "Участники соревнований", // Заголовок окна
        WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
        300, // x координата по горизонтали
        200, // y координата по вертикали
        516, // ширина создаваемого окна
        380, // высота создаваемого окна
        NULL,
        NULL,
        hInstance, // переменная экземпляра приложения
        NULL);

	//Создание строки состояния
    HWND hStatusWindow = CreateStatusWindow (WS_CHILD | WS_VISIBLE, "", g_hMainWnd, 5000); 
 
    HMENU hMainMenu, hPopMenuFile;
    hMainMenu = CreateMenu();
	hPopMenuFile = CreatePopupMenu();

    AppendMenu(hMainMenu, MF_STRING|MF_POPUP, (UINT)hPopMenuFile, "Меню"); 
	
	AppendMenu(hPopMenuFile, MF_STRING, 1000, "Добавить");
	AppendMenu(hPopMenuFile, MF_STRING, 1001, "Выход");

    SetMenu(g_hMainWnd, hMainMenu);
	
	HWND hwndGoto = NULL;

    // Если окно не было создано, то выдаем сообщение
    if (!g_hMainWnd)
    {
        int nResult = GetLastError();
        MessageBox(NULL, "Окно не было создано!", "Ошибка", MB_ICONERROR);
    }
			
    // Показываем окно
    ShowWindow(g_hMainWnd, nShowCmd);

    // Объявляем переменную для сообщений типа MSG
    MSG msg;
    // Цикл обработки сообщений
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return 0;
}
 
// определяем процедуру обратного вызова (WinApi)
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_CREATE:
            // Здесь будем создавать элементы управления окна
            ListViewCreate(hwnd);
            ListViewAddItem("Головин П. Н.", "1");
            ListViewAddItem("Марков В. А.", "2");
            ListViewAddItem("Кудряшов Н. К.", "3");
            ListViewAddItem("Маслов Е. С.", "4");
            return 0;
 
        case WM_SIZE:
            ListViewResize();
            return 0;
	
		case WM_COMMAND:
			switch (LOWORD(wParam)) 
			{ 
				case IDM_GOTO: 
					if (!IsWindow(hwndGoto)) 
				{ 
						hwndGoto = CreateDialogParam(hInstance, 
												MAKEINTRESOURCE(IDD_DIALOG), 
												NULL, 
												(DLGPROC)GoToProc); 
						ShowWindow(hwndGoto, SW_SHOW);
				} 
				break; 
			} 
			return 0L; 

        case WM_DESTROY: // Обработка нажатия кнопки закрытия окна
            PostQuitMessage(0);
            return 0;
    }
 
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
 
BOOL ListViewCreate(HWND hParent)
{
    INITCOMMONCONTROLSEX icex;
    icex.dwSize = sizeof(icex);
    icex.dwICC = ICC_LISTVIEW_CLASSES;
    InitCommonControlsEx(&icex);
    
    // размер главного окна
    RECT rcClient;
    GetClientRect(hParent, &rcClient);
 
    // создание списка
    g_hListView = CreateWindow(
        WC_LISTVIEW, 
        NULL, 
        LVS_SINGLESEL | LVS_REPORT | WS_CHILD | WS_VISIBLE, //стиль отображения столбцов
        rcClient.left, 
        rcClient.top, 
        rcClient.right - rcClient.left, 
        rcClient.bottom - rcClient.top, 
        hParent, 
        (HMENU) ID_LISTVIEW, 
        g_hInstance, 
        NULL);
 
    if (!g_hListView)
        return FALSE;
 
    // доп. свойства
    ListView_SetExtendedListViewStyleEx(g_hListView, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
 
    // добавить столбцы
    LVCOLUMN lvc;
    lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
    lvc.iSubItem = 0;
    lvc.pszText = "ФИО";
    lvc.cx = 260;
    if (ListView_InsertColumn(g_hListView, 0, &lvc) == -1)
        return FALSE;
    lvc.iSubItem = 1;
    lvc.pszText = "Рейтинг";
    lvc.cx = 250;
    if (ListView_InsertColumn(g_hListView, 1, &lvc) == -1)
        return FALSE;
 
    return TRUE;
}
 
BOOL ListViewAddItem(char* pCol1, char* pCol2)
{
    LVITEM lvi;
    lvi.mask = LVIF_TEXT;
    lvi.iSubItem = 0;
    lvi.iItem = 0x7FFFFFFF;
    lvi.pszText = pCol1;
    // добавить элемент
    int index = ListView_InsertItem(g_hListView, &lvi);
    if (index < 0)
        return FALSE;
 
    // установить текст во второй столбец элемента
    ListView_SetItemText(g_hListView, index, 1, pCol2);
 
    return TRUE;
}
 
VOID ListViewResize()
{
    RECT rcClient;
    GetClientRect(g_hMainWnd, &rcClient);
 
    SetWindowPos(g_hListView, 0, 0, 0, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, SWP_NOZORDER);
}
Файл ресурса
Код:
#define IDD_DIALOG 101

IDD_DIALOG DIALOGEX 0, 0, 316, 180
STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "Добавить", 400, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "ОК",IDOK,205,159,50,14
    PUSHBUTTON      "Отмена",IDCANCEL,259,159,50,14
END
Здесь наверно тоже не так что-то.
ИвановБ вне форума Ответить с цитированием
Старый 03.05.2018, 15:48   #24
ИвановБ
Пользователь
 
Регистрация: 19.12.2016
Сообщений: 70
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
lpDialogFunc [in, optional]
Type: DLGPROC

A pointer to the dialog box procedure. For more information about the dialog box procedure, see DialogProc.
И кто ее по вашему должен объявлять и реализовывать?
Инфу про это читаю в тех документе, но не въеду что в ней.... Мда...стыдно. Голова уже что ли не соображает.
ИвановБ вне форума Ответить с цитированием
Старый 03.05.2018, 15:50   #25
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,694
По умолчанию

Цитата:
Сообщение от ИвановБ Посмотреть сообщение
Убираю подключение ресурсного файла ошибка уходит.
Значит ошибка где? Проверяйте все ли END на месте и т.д.

Цитата:
FONT 8, "Добавить", 400, 0, 0x1
У вас действительно в системе зарегистрирован шрифт "Добавить"?

У CreateDialogParam 5 параметров, в примере использовался макрос CreateDialog с 4 параметрами.

Цитата:
Сообщение от ИвановБ Посмотреть сообщение
Инфу про это читаю в тех документе, но не въеду что в ней
Цитата:
Remarks
You should use the dialog box procedure only if you use the dialog box class for the dialog box. This is the default class and is used when no explicit class is specified in the dialog box template. Although the dialog box procedure is similar to a window procedure, it must not call the DefWindowProc function to process unwanted messages. Unwanted messages are processed internally by the dialog box window procedure.

Последний раз редактировалось p51x; 03.05.2018 в 15:52.
p51x вне форума Ответить с цитированием
Старый 03.05.2018, 16:01   #26
ИвановБ
Пользователь
 
Регистрация: 19.12.2016
Сообщений: 70
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
У вас действительно в системе зарегистрирован шрифт "Добавить"?
Да ошибка тупая не туда вписал...

Цитата:
Сообщение от p51x Посмотреть сообщение
Значит ошибка где? Проверяйте все ли END на месте и т.д.
Да ошибку на синтаксис дает.
ИвановБ вне форума Ответить с цитированием
Старый 03.05.2018, 16:04   #27
ИвановБ
Пользователь
 
Регистрация: 19.12.2016
Сообщений: 70
По умолчанию

p51x, Не удобно конечно, но может покажете как должно правильно выглядеть?

Цитата:
Сообщение от p51x Посмотреть сообщение
Remarks
You should use the dialog box procedure only if you use the dialog box class for the dialog box. This is the default class and is used when no explicit class is specified in the dialog box template. Although the dialog box procedure is similar to a window procedure, it must not call the DefWindowProc function to process unwanted messages. Unwanted messages are processed internally by the dialog box window procedure.
То есть получается это мне не обязательно?

Последний раз редактировалось ИвановБ; 03.05.2018 в 16:07.
ИвановБ вне форума Ответить с цитированием
Старый 03.05.2018, 16:11   #28
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,694
По умолчанию

Если вам нужен стандартный тупой диалог без изысков, то да - есть стандартная процедура обработки. Не зря же параметр помечен, как опциональный.
p51x вне форума Ответить с цитированием
Старый 03.05.2018, 16:19   #29
ИвановБ
Пользователь
 
Регистрация: 19.12.2016
Сообщений: 70
По умолчанию

Не нужно изысков, а что вместо него записывать? В тех документе я не вижу, что используется вместо
ИвановБ вне форума Ответить с цитированием
Старый 03.05.2018, 16:30   #30
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,694
По умолчанию

Какой тип у этого параметра? Указатель, даже в описании написано. Какое значение указателя показывает, что этот указатель ни на что не ссылается?
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Графический интерфейс KoRn0509 Python 7 23.10.2017 23:04
Графический интерфейс в DOS Maksimall89 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 21.12.2011 17:23
Не могу создать графический интерфейс PastoriXx Общие вопросы по Java, Java SE, Kotlin 2 08.12.2010 15:11
Графический интерфейс aTBepTKa Общие вопросы C/C++ 2 04.02.2009 16:18