Inter-thread SendMessage() bugfixes:
[wine] / libtest / hello3.c
1 #include <windows.h>
2 #include <resource.h>
3 #include "hello3res.h"
4 #include <commdlg.h>
5
6 BOOL FileOpen(HWND hWnd)
7 {
8   char filename[80] = "test.c";
9   OPENFILENAME ofn = { sizeof(OPENFILENAME),
10                        hWnd, NULL, "C code\0*.c\0", NULL, 0, 0, filename, 80,
11                        NULL, 0, NULL, NULL, OFN_CREATEPROMPT |
12                        OFN_SHOWHELP, 0, 0, NULL, 0, NULL };
13   return GetOpenFileName(&ofn);
14 }
15
16 BOOL CALLBACK DlgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
17 {
18         switch(msg)
19         {
20                 case WM_INITDIALOG:
21                         return 1;
22                 case WM_COMMAND:
23                 if(wParam==100)
24                         DestroyWindow(hWnd);
25                 return 0;
26         }
27         return 0;
28 }
29
30 LRESULT WndProc (HWND wnd, UINT msg, WPARAM w, LPARAM l)
31 {
32     switch (msg){
33
34         case WM_COMMAND:
35         switch(w){
36                 case 100:
37                         CreateDialogIndirect(0,hello3res_DIALOG_DIADEMO.bytes,wnd,(WNDPROC)DlgProc);
38                         return 0;
39                 case 101:
40                 {
41                         BITMAPINFO *bm=(BITMAPINFO*)hello3res_BITMAP_BITDEMO.bytes;
42                         char *bits=(char*)bm;
43                         HDC hdc=GetDC(wnd);
44                         bits+=bm->bmiHeader.biSize;
45                         bits+=(1<<bm->bmiHeader.biBitCount)*sizeof(RGBQUAD);
46                         SetDIBitsToDevice(hdc,0,0,bm->bmiHeader.biWidth,
47                                 bm->bmiHeader.biHeight,0,0,0,bm->bmiHeader.biHeight,
48                                 bits,bm,DIB_RGB_COLORS);
49                         ReleaseDC(wnd,hdc);
50                         return 0;
51                 }
52                 case 102:
53                         FileOpen(wnd);
54                         return 0;
55                 default:
56                         return DefWindowProc (wnd, msg, w, l);
57         }
58     case WM_DESTROY:
59         PostQuitMessage (0);
60         break;
61
62     default:
63         return DefWindowProc (wnd, msg, w, l);
64     }
65     return 0l;
66 }
67
68 int PASCAL WinMain (HANDLE inst, HANDLE prev, LPSTR cmdline, int show)
69 {
70     HWND     wnd;
71     MSG      msg;
72     WNDCLASS class;
73     char className[] = "class";  /* To make sure className >= 0x10000 */
74     char winName[] = "Test app";
75
76     if (!prev){
77         class.style = CS_HREDRAW | CS_VREDRAW;
78         class.lpfnWndProc = WndProc;
79         class.cbClsExtra = 0;
80         class.cbWndExtra = 0;
81         class.hInstance  = inst;
82         class.hIcon      = LoadIcon (0, IDI_APPLICATION);
83         class.hCursor    = LoadCursor (0, IDC_ARROW);
84         class.hbrBackground = GetStockObject (WHITE_BRUSH);
85         class.lpszMenuName = 0;
86         class.lpszClassName = (SEGPTR)className;
87     }
88     if (!RegisterClass (&class))
89         return FALSE;
90
91     wnd = CreateWindow (className, winName, WS_OVERLAPPEDWINDOW,
92                         CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 
93                         LoadMenu(inst,"MAIN"), inst, 0);
94     ShowWindow (wnd, show);
95     UpdateWindow (wnd);
96
97     while (GetMessage (&msg, 0, 0, 0)){
98         TranslateMessage (&msg);
99         DispatchMessage (&msg);
100     }
101     return 0;
102 }