User 11061201 Ответов: 3

C++ вопрос о рутине в winforms


Привет, я не знаю, с чего начать свой код на C++ с помощью winforms. Там нет процедуры main (), вместо нее есть процедура WinMain (), так что куда именно ставить мой код, а куда нет. Где петля?
Я хочу добавить;
while (1) {...вызовите другой метод;}

int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)


HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */
//......
//......
/* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;
//.....
hwnd = CreateWindowEx (.....)

//.....
ShowWindow (hwnd, nCmdShow);
while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}


Что я уже пробовал:

--------------------------------------------------------

3 Ответов

Рейтинг:
4

User 11061201

Я закончил тем, что создал некоторые события, я не уверен, что это способ использовать в C++, но хорошо для некоторого тестирования.

bool onLoad;
void on_Load();

bool onClosing;
void on_Closing();


LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    if(onLoad == false)
    {
        onLoad = true;
        on_Load();
    }

    switch (message)                  /* handle the messages */
    {
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            onClosing = true;
            on_Closing();
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}


void on_Load()
{
    //FORMS HAS LOADED
    //do stuff
   ofstream myFile;
		myFile.open("C:\\Loading.txt", ios::out | ios::app);
		myFile << "Loading!";
		myFile.close();

}

void on_Closing()
{
    //FORM IS CLOSING
    //do stuff
    ofstream myFile;
		myFile.open("C:\\Closing.txt", ios::out | ios::app);
		myFile << "Closing!";
		myFile.close();
}


Richard MacCutchan

То, что вы имеете здесь, на самом деле не является способом сделать это. Вернитесь и поработайте над учебником, который я предложил.

Рейтинг:
2

Richard MacCutchan

Видеть EFNet #Winprog[^] и Программирование Win32 - FunctionX[^] для некоторых полезных учебных пособий.


[no name]

Спасибо за ссылки, я не планирую делать настоящие приложения WinForm на C++, так как знаком с ними VB.NET и с этим все очень просто. Я только недавно начал работать с C++, и мне любопытно, как можно создать собственное приложение Win32 с помощью WINAPI, на котором я также могу иметь свои функции, как в VB.NET или мир C#.

Richard MacCutchan

Обе эти ссылки научат вас использовать Windows API (не WinForms) в C/C++. Учебник в первой ссылке - отличная отправная точка.

Рейтинг:
0

OriginalGriff

Winforms не похож на консольное приложение, есть "основной" процесс, но это не то место, куда вы помещаете большую часть своего кода (если таковой имеется). И нет никакой петли в том смысле, который вы имеете в виду!

Вместо этого он должен обрабатывать сообщения Windows и вызывать соответствующую функцию при получении конкретного сообщения - и он "сидит" в цикле вечно, получая сообщения и обрабатывая их, - вот и все, что он делает. Фактическая работа вашего приложения выполняется в функциях, которые вызываются в ответ на полученные сообщения (большинство из них генерируются пользователем, поэтому вы в основном реагируете на инициированные пользователем события) Такие события включают в себя перемещение мыши, нажатие кнопки мыши, нажатие или отпускание клавиши клавиатуры.

Не просто погружайтесь в эти вещи: читайте свою книгу или заметки курса - или если у вас нет книги или курса, получите один - и он объяснит, что и где ты делаешь. Кодирование Windows-это не то же самое, что" традиционный " процедурный код, где вы спрашиваете пользователя, что делать: вместо этого вы реагируете на то, что делает пользователь, что является гораздо большей разницей, чем вы могли бы подумать!


[no name]

Я родом оттуда .NET world и есть процедуры, которые работают как раз одновременно с WinForm. Например, скрытая процедура Main (), которая запускает приложение WinForm aka.Начало (Новая Форма 1). Потому что в этом проекте C++ я пока не планирую ничего реализовывать только для того, чтобы протестировать некоторые функции ввода-вывода, пока окно просто сидит там.