Creating a Message Loop
Windows automatically creates a message queue for each thread. If the thread
creates one or more windows, a message loop must be provided; this message loop
retrieves messages from the thread's message queue and dispatches them to the
appropriate window procedures.
Because Windows directs messages to individual windows in an application, a
thread must create at least one window before starting its message loop. Most
Windows-based applications contain a single thread that creates windows. A typical
application registers the window class for its main window, creates and shows
the main window, and then starts its message loop
all in the
WinMain function.
You create a message loop by using the
GetMessage and
DispatchMessage functions. If your application must obtain character input from the user,
include the
TranslateMessage function in the loop.
TranslateMessage translates virtual-key messages into character messages. The following
example shows the message loop in the
WinMain function of a simple Win32-based application.
HINSTANCE hinst;
HWND hwndMain;
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow)
{
MSG msg;
WNDCLASS wc;
UNREFERENCED_PARAMETER(lpszCmdLine);
// Register the window class for the main window.
if (!hPrevInstance)
{
wc.style = 0;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon((HINSTANCE) NULL,
IDI_APPLICATION);
wc.hCursor = LoadCursor((HINSTANCE) NULL,
IDC_ARROW);
wc.hbrBackground = GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = "MainMenu";
wc.lpszClassName = "MainWndClass";
if (!RegisterClass(&wc))
return FALSE;
}
hinst = hInstance; // save instance handle
// Create the main window.
hwndMain = CreateWindow("MainWndClass", "Sample",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, (HWND) NULL,
(HMENU) NULL, hinst, (LPVOID) NULL);
// If the main window cannot be created, terminate
// the application.
if (!hwndMain)
return FALSE;
// Show the window and paint its contents.
ShowWindow(hwndMain, nCmdShow);
UpdateWindow(hwndMain);
// Start the message loop.
while (GetMessage(&msg, (HWND) NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// Return the exit code to Windows.
return msg.wParam;
}
The following example shows a message loop for a thread that uses accelerators
and displays a modeless dialog box. When
TranslateAccelerator or
IsDialogMessage returns TRUE (indicating that the message has been processed),
TranslateMessage and
DispatchMessage are not called. The reason for this is that
TranslateAccelerator and
IsDialogMessage perform all necessary translating and dispatching of messages.
HWND hwndMain;
HWND hwndDlgModeless = NULL;
MSG msg;
HACCEL haccel;
//
// Perform initialization and create a main window.
//
while (GetMessage(&msg, (HWND) NULL, 0, 0))
{
if (hwndDlgModeless == (HWND) NULL ||
!IsDialogMessage(hwndDlgModeless, &msg) &&
!TranslateAccelerator(hwndMain, haccel,
&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
- Software for developers
-
Delphi Components
.Net Components
Software for Android Developers
- More information resources
-
MegaDetailed.Net
Unix Manual Pages
Delphi Examples
- Databases for Amazon shops developers
-
Amazon Categories Database
Browse Nodes Database