Задать вопрос

Ошибка С2360, initialization of 'hInstanse' is skipped by 'case' label, почему?

#include "Windows.h"
#include "windowsx.h"
#include "tchar.h"
#include "resource.h"

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
HCURSOR hCursor1, hCursor2;

int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nShowCmd)
{
    WCHAR className[] = L"FirstWindow";
    WNDCLASSEX wndClass;
    wndClass.cbSize = sizeof(WNDCLASSEX);
    wndClass.style = CS_HREDRAW | CS_VREDRAW;
    wndClass.hInstance = hInstance;

    //LoadCursor загружает курсор из ресурсов приложения
    //MAKEINTRESOURCE нужен для преобразования идентификатора в строку
    wndClass.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1));
    //LoadCursor загружает иконку из ресурсов приложения
    wndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON2));
    wndClass.hIconSm = NULL;
    wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wndClass.cbClsExtra = 0;
    wndClass.cbWndExtra = 0;
    wndClass.lpszMenuName = NULL;
    wndClass.lpszClassName = className;

    wndClass.lpfnWndProc = WindowProc;

    if (!RegisterClassEx(&wndClass)) {
        return 0;
    }

    HWND hWnd = CreateWindowEx(
        0,
        className,
        L"My first window",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, //x,y
        CW_USEDEFAULT, CW_USEDEFAULT, //width, height
        NULL,
        NULL,
        hInstance,
        NULL
    );

    ShowWindow(hWnd, nShowCmd);
    UpdateWindow(hWnd);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    int x, y;
    switch (uMsg)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            break;

        case WM_CREATE:
            //получаем дескриптор приложения
            HINSTANCE hInstance = GetModuleHandle(0);
            //загружаем курсоры из ресурсов приложения
            hCursor1 = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR2));
            hCursor2 = LoadCursor(hInstance, MAKEINTRESOURCE(IDI_ICON1));
            break;

        case WM_MOUSEMOVE:
            //устанавливаем тот или иной курсор в зависимости от местонахождения мыши
            RECT rect;
            GetClientRect(hwnd, &rect);
            x = LOWORD(lParam);
            y = HIWORD(wParam);
            if (x >= rect.right / 4 && x <= rect.right * 3 / 4 && y >= rect.bottom / 4 && y <= rect.bottom * 3 / 4) {
                SetCursor(hCursor1);
            }
            else {
                SetCursor(hCursor2);
            }
            break;
    }

    return 0;
}

Выскакивает initialization of 'hInstanse' is skipped by 'case' label.
  • Вопрос задан
  • 299 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
initialization of 'hInstanse' is skipped by 'case' label, почему?
switch (uMsg)
{
...
case WM_CREATE:
//получаем дескриптор приложения
HINSTANCE hInstance = GetModuleHandle(0);
...
break;

case WM_MOUSEMOVE:
//устанавливаем тот или иной курсор в зависимости от местонахождения мыши
...

Потому что -- посмотри в этот код -- это фактически так: перейдя на метку WM_MOUSEMOVE код попадёт в область где hInstance определён, но минует его инициализацию. Компилятор туповат, чтобы понять, что hInstance дальше не используется. Простейший фикс -- обернуть код обработчиков в блоки:
switch (uMsg)
{
...
case WM_CREATE:
{
  //получаем дескриптор приложения
  HINSTANCE hInstance = GetModuleHandle(0);
  ...
}
break;

case WM_MOUSEMOVE:
{
  //устанавливаем тот или иной курсор в зависимости от местонахождения мыши
  ...
}
...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы