Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
SpLoT
0 / 0 / 0
Регистрация: 27.05.2012
Сообщений: 5
1

Дочернее окна win32 API

27.05.2012, 15:53. Просмотров 4294. Ответов 8
Метки нет (Все метки)

Привет всем. у мя возникла небольшая проблема при создании дочернего окна. Суть такова, что при нажатии кнопки оно должно появиться. Вроде все правильно написано, компилятор не находит ошибок, а окно не создается.

C++
1
2
3
4
5
6
7
8
9
10
11
12
case WM_COMMAND: 
        switch (LOWORD(wParam)) 
        { 
            case ID_OK1:
                {
                hChild = CreateWindow ("KWndClassChild", "Табель учета рабочего времени", WS_CHILD | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_VISIBLE, 
                    100, 100, 800, 600, hWnd, NULL, ::GetModuleHandle(NULL), NULL);
                if(!hChild) MessageBox(0, 0, 0, 0); // сигнализируем об ошибке
                ShowWindow(hChild, SW_SHOWNORMAL);
                break;
                }
//....и прочее
И класс вроде зарегила:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
BOOL InitApplication(HINSTANCE hInstance)
{
    WNDCLASSEX wc;
 
    char ChildClassName[] = "KWndClassChild";
 
    memset(&wc, 0, sizeof(WNDCLASSEX));
    wc.style            = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc      = ChildProc;
    wc.cbClsExtra       = 0;
    wc.cbWndExtra       = 0;
    wc.hInstance        = hInst;
    wc.hbrBackground    = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName     = NULL;
    wc.lpszClassName    = ChildClassName;
 
    return RegisterClassEx(&wc);
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2012, 15:53
Ответы с готовыми решениями:

[Win32 API] Как создавать скины для своего окна?
Привет. Все видим и пользуемся программками, окна которых имеют свой, не дефолтныйWindows стиль....

win32 api таблица
у меня вопросик. можно с помощью только тишь api создать элемент как таблица? есть ли готовый класс...

Обработка сообщений в win32 api
Написал программу которая после ввода в поле edit текста exit и нажатия на кнопку выходит из...

Как в C++ Win32 через API определить что кнопка нажата ???
Как в C++ Win32 через API определить что кнопка нажата ???

В Win32 Api под Visual Studio что-то не так с кодировками
Здравствуйте, решил освоить Win32 Api, работаю в Visual Studio 2017. При помощи команды TextOut...

8
castaway
Эксперт С++
4946 / 3052 / 455
Регистрация: 10.11.2010
Сообщений: 11,147
Записей в блоге: 10
Завершенные тесты: 1
29.05.2012, 10:12 2
Если бы ты показала весь код, то было бы намного проще сказать где ошибка.
0
SpLoT
0 / 0 / 0
Регистрация: 27.05.2012
Сообщений: 5
29.05.2012, 17:41  [ТС] 3
Использую Visual 2008.
В общем вся программка.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
//===================================================================================================
//: Main Form.cpp
#include "stdafx.h"
 
#define N_PARTS 2
 
HWND hStatusBar;
HWND hButton1;
HWND hButton2;
HWND hChild;
 
HINSTANCE hInst;
 
char szClassName[] = "KWndClass";
 
//BOOL InitApplication(HINSTANCE);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void StatusBar(HWND);
LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK DialogBox1(HWND, UINT, WPARAM, LPARAM); 
//BOOL CALLBACK DialogBox2(HWND, UINT, WPARAM, LPARAM);
//===================================================================================================
BOOL InitApplication(HINSTANCE hInstance)
{
    WNDCLASSEX wc;
 
    char ChildClassName[] = "KWndClassChild";
 
    memset(&wc, 0, sizeof(WNDCLASSEX));
    wc.style            = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc      = ChildProc;
    wc.cbClsExtra       = 0;
    wc.cbWndExtra       = 0;
    wc.hInstance        = hInst;
    wc.hbrBackground    = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName     = NULL;
    wc.lpszClassName    = ChildClassName;
 
    return RegisterClassEx(&wc);
}
//===================================================================================================
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;
    KWnd mainWnd("Табель учета рабочего времени", hInstance, nCmdShow, WndProc,
        MAKEINTRESOURCE(IDR_MENU1), 0, 100, 1000, 600); 
 
    // Инициализация библиотеки "Common Control Library"
    INITCOMMONCONTROLSEX icc;
    icc.dwSize = sizeof(INITCOMMONCONTROLSEX);
    icc.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&icc);
 
    while (GetMessage(&msg, NULL, 0, 0))  {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int) msg.wParam;
}
//===================================================================================================
void StatusBar(HWND hStatusBar) 
{
    int aWidths[N_PARTS];
    
    aWidths [0] = 300;
    aWidths [1] = -1;
 
    SendMessage(hStatusBar, SB_SETMINHEIGHT, 24, 0);
 
    SendMessage(hStatusBar, SB_SETPARTS, N_PARTS, (LPARAM)aWidths);
    
    SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)(LPSTR)TEXT("    Текущая дата:  "));
    SendMessage(hStatusBar, SB_SETTEXT, 1, (LPARAM)(LPSTR)TEXT("    Пользователь: "));
}
//===================================================================================================
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    RECT rect, rcSB;    //Позиция и размеры главного окна и hStatusBar
    static int bmpWidth, bmpHeight;
    static HBITMAP hBitmap;      // дескриптор битового образа
    static LOGFONT lf1, lf2;
    static HFONT hFont1, hFont2;
    HDC hMemDC;                  // дескриптор совместимого контекста
    BITMAP bm;
    int sbHeight;       //Высота hStatusBar
    int dX, dY;
    int userReply;
    static TCHAR name[256] = "";
    static OPENFILENAME file;
    std :: ifstream in;
    std :: ofstream out;
    static std :: vector < std :: string > v;
    //std :: vector < std :: string > :: iterator it;
    std :: string st;
    
    switch (uMsg)
    {
    case WM_CREATE:
        {   
        // Создание строки состояния
        hStatusBar = CreateStatusWindow(WS_CHILD | WS_VISIBLE, "", hWnd, ID_STATUSBAR);
        if (hStatusBar==NULL) return FALSE;
        
        //Создание кнопки "Создать"
        hButton1 = CreateWindow ("BUTTON", "Создать", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | BS_BITMAP | BS_TEXT ,
            100, 100, 150, 100, hWnd, (HMENU)BTN1, NULL, NULL);
        //Загрузка изображени на кнопку
        HANDLE hBmpBut1 = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP2), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
        SendMessage(hButton1, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBmpBut1);
        //Изменение размера шрифта кнопки
        lf1.lfHeight = 28;
        lstrcpy((LPSTR)&lf1.lfFaceName, "Verdana");
        hFont1 = CreateFontIndirect(&lf1);
        SendMessage(hButton1, WM_SETFONT, (WPARAM)hFont1, TRUE);
        
        //Создание кнопки "Открыть"
        hButton2 = CreateWindow ("BUTTON", "Открыть", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | BS_BITMAP,
            100, 300, 150, 100, hWnd, (HMENU)BTN2, NULL, NULL);
        //Загрузка изображени на кнопку
        HANDLE hBmpBut2 = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP3), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
        SendMessage(hButton2, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBmpBut2);
        //Изменение размера шрифта кнопки
        lf2.lfHeight = 28;
        lstrcpy((LPSTR)&lf2.lfFaceName, "Verdana");
        hFont2 = CreateFontIndirect(&lf2);
        SendMessage(hButton2, WM_SETFONT, (WPARAM)hFont2, TRUE);
        
        hDC = GetDC(hWnd);
        //Загрузка изображения в клиентскую область
        hBitmap = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
        SendMessage(hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap);
 
        GetObject(hBitmap, sizeof(bm), &bm);
        bmpWidth = bm.bmWidth;
        bmpHeight = bm.bmHeight;
        // Подогнать размеры окна программы под размер растра hBitmap c учетом строки состояния
        GetClientRect(hWnd, &rect);
        GetWindowRect(hStatusBar, &rcSB);
        sbHeight = rcSB.bottom - rcSB.top;
        dX = bmpWidth - rect.right;
        dY = bmpHeight - rect.bottom + sbHeight;
        GetWindowRect(hWnd, &rect);
        InflateRect(&rect, dX/2, dY/2);
        MoveWindow(hWnd, rect.left, rect.top, rect.right-rect.left+300, rect.bottom-rect.top, TRUE);
        ReleaseDC(hWnd, hDC);
 
        //Заполнение структуры OPENFILENAME
        file.lStructSize     = sizeof(OPENFILENAME);
        file.hInstance       = hInst;
        file.lpstrFilter     = "Книга Excel 97-2003 (*.xls)\0*.xls";
        file.lpstrFile       = name;
        file.nMaxFile        = 256;
        file.lpstrInitialDir = ".\\";
        file.lpstrDefExt     = "xls";
        }
        break;
 
        SendMessage(hStatusBar, SB_SIMPLE, FALSE, 0);
    
    case WM_PAINT:
        hDC = BeginPaint(hWnd, &ps);
        // Создать совместимый контекст
        hMemDC = CreateCompatibleDC(hDC);
        // Выбрать hBitmap в совместимый контекст        
        SelectObject(hMemDC, hBitmap);
        // Скопировать изображение из hMemDC в hDC
        BitBlt(hDC, 300, 0, bmpWidth, bmpHeight, hMemDC, 0, 0, SRCCOPY);
        DeleteDC(hMemDC);
        EndPaint(hWnd, &ps);
        break;
 
    case WM_SIZE:
        StatusBar(hStatusBar);
        SendMessage (hStatusBar, WM_SIZE, wParam, lParam);
        break;
 
     case WM_COMMAND:
        switch(LOWORD(wParam))
        {
            // Нажата кнопка "Создать"
            case BTN1:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DialogBox1);
                break;
            // Нажата кнопка "Открыть"
            case BTN2:
                {
                //DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG2), hWnd, DialogBox2);
                file.lpstrTitle = "Открыть файл";
                file.Flags = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOTESTFILECREATE;
                if(!GetOpenFileName(&file)) return 1;
                out.open(name);
                while(getline(in, st)) v.push_back(st);
                out.close();
                InvalidateRect(hButton1, NULL, 1);
                break;
                }
            default:
                break;
        }
        InvalidateRect(hWnd, NULL, TRUE);
        break;
 
    case WM_CLOSE:
        userReply = MessageBox(hWnd, "Уже уходите?",
            "", MB_YESNO | MB_ICONQUESTION);
        if (IDYES == userReply)
            DestroyWindow(hWnd);
        break;
 
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
 
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}
//===================================================================================================
BOOL CALLBACK DialogBox1(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    int a[] = {IDC_STATIC1, IDC_STATIC2, IDC_STATIC3};
    static HWND hStatic;
    static LOGFONT lf;  // static для инициализации полей нулями
    static HFONT hFont;
 
    switch (uMsg) 
    { 
    case WM_INITDIALOG:
        for (int i = 0; i < 3; i++)
        {
        hStatic = GetDlgItem(hWnd, a[i]);
        // Создание логического шрифта Verdana
        lf.lfHeight = 30;
        lstrcpy((LPSTR)&lf.lfFaceName, "Times New Roman");
        hFont = CreateFontIndirect(&lf);
        // Модификация шрифта для элемента hStatic
        SendMessage(hStatic, WM_SETFONT, (WPARAM)hFont, TRUE );  
        }
 
    case WM_COMMAND: 
        switch (LOWORD(wParam)) 
        { 
            case ID_OK1:
                //case WM_CREATE:
                {
                //DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG2), hWnd, DialogBox2);
                // Создание дочернего окна
                hChild = CreateWindowEx (WS_EX_TOOLWINDOW, "KWndClassChild", "Табель учета рабочего времени", WS_CHILDWINDOW | WS_OVERLAPPED | WS_CAPTION, 
                    100, 100, 800, 600, hWnd, NULL, ::GetModuleHandle(NULL), NULL);
                if(!hChild) MessageBox(0, 0, 0, 0); // сигнализируем об ошибке
                ShowWindow(hChild, SW_SHOWNORMAL);
                hStatusBar = CreateStatusWindow(WS_CHILD | WS_VISIBLE, "", hWnd, ID_STATUSBAR);
                break;
                }
 
            case ID_CANCEL1: 
                EndDialog(hWnd, 0);
                return TRUE;
            
            default:
                break;
        } 
        break;
        
    case WM_CLOSE:
        SendMessage(hChild, WM_CLOSE, 0, 0); // уничтожаем дочернее окно
        DestroyWindow(hWnd); // уничтожаем главное
        UnregisterClass(szClassName, hInst); // разрегистрируем класс главного окна
    
    } 
    return FALSE; 
} 
//===================================================================================================
LRESULT CALLBACK ChildProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    RECT rect;
    PAINTSTRUCT ps;
    HDC hdc;
 
    switch (uMsg)
    {
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            // Вот и добавляем код рисования:
            GetClientRect(hWnd, &rect);
            DrawText(hdc, "This is a Child Window", -1, &rect,
                DT_SINGLELINE | DT_CENTER | DT_VCENTER);
            EndPaint(hWnd, &ps);
            break;
 
        case WM_CLOSE:
            DestroyWindow(hWnd);
            break;
 
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
 
        default:
            return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}
//===================================================================================================
/*BOOL CALLBACK DialogBox2(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (uMsg) 
    { 
    case WM_COMMAND: 
        switch (LOWORD(wParam)) 
        { 
            case ID_OK2: 
                MessageBox(hWndDlg, "Нажата кнопка 'OK'", "OK", MB_OK);
                return TRUE;
 
            case ID_CANCEL2: 
                EndDialog(hWndDlg, 0);
                return TRUE;
 
        } 
        break;
    } 
    return FALSE; 
} */
//!
//===================================================================================================
0
castaway
Эксперт С++
4946 / 3052 / 455
Регистрация: 10.11.2010
Сообщений: 11,147
Записей в блоге: 10
Завершенные тесты: 1
29.05.2012, 21:16 4
Цитата Сообщение от SpLoT Посмотреть сообщение
И класс вроде зарегила
Не зарегила. InitApplication() у тебя сама по себе.
0
29.05.2012, 21:16
SpLoT
0 / 0 / 0
Регистрация: 27.05.2012
Сообщений: 5
29.05.2012, 21:23  [ТС] 5
Даже если и не сама по себе, ничего не меняется.(((
0
castaway
Эксперт С++
4946 / 3052 / 455
Регистрация: 10.11.2010
Сообщений: 11,147
Записей в блоге: 10
Завершенные тесты: 1
29.05.2012, 21:37 6
А у тебя ID_OK1 вообще срабатывает?
DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DialogBox1) создается?

P.S.:
Имя класса szClassName нигде не регистрируется. Но в 71-й строке ты вызываешь UnregisterClass.

+ показывай исправленный код.
0
SpLoT
0 / 0 / 0
Регистрация: 27.05.2012
Сообщений: 5
29.05.2012, 21:41  [ТС] 7
Dialog1 открывается. ID_OK1 срабатывает. Проверяли при помощи второго диалогового окна, которое в свою очередь открывается.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
#include "stdafx.h"
 
#define N_PARTS 2
 
HWND hStatusBar;
HWND hButton1;
HWND hButton2;
HWND hChild;
 
HINSTANCE hInst;
 
char szClassName[] = "KWndClass";
 
BOOL InitApplication(HINSTANCE);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void StatusBar(HWND);
LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK DialogBox1(HWND, UINT, WPARAM, LPARAM); 
//BOOL CALLBACK DialogBox2(HWND, UINT, WPARAM, LPARAM);
//===================================================================================================
BOOL InitApplication(HINSTANCE hInstance)
{
    WNDCLASSEX wc;
 
    char ChildClassName[] = "KWndClassChild";
 
    memset(&wc, 0, sizeof(WNDCLASSEX));
    wc.style            = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc      = ChildProc;
    wc.cbClsExtra       = 0;
    wc.cbWndExtra       = 0;
    wc.hInstance        = hInst;
    wc.hbrBackground    = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName     = NULL;
    wc.lpszClassName    = ChildClassName;
 
    return RegisterClassEx(&wc);
}
//===================================================================================================
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;
    KWnd mainWnd("Табель учета рабочего времени", hInstance, nCmdShow, WndProc,
        MAKEINTRESOURCE(IDR_MENU1), 0, 100, 1000, 600); 
 
    // Инициализация библиотеки "Common Control Library"
    INITCOMMONCONTROLSEX icc;
    icc.dwSize = sizeof(INITCOMMONCONTROLSEX);
    icc.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&icc);
 
    while (GetMessage(&msg, NULL, 0, 0))  {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int) msg.wParam;
}
//===================================================================================================
void StatusBar(HWND hStatusBar) 
{
    int aWidths[N_PARTS];
    
    aWidths [0] = 300;
    aWidths [1] = -1;
 
    SendMessage(hStatusBar, SB_SETMINHEIGHT, 24, 0);
 
    SendMessage(hStatusBar, SB_SETPARTS, N_PARTS, (LPARAM)aWidths);
    
    SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)(LPSTR)TEXT("    Текущая дата:  "));
    SendMessage(hStatusBar, SB_SETTEXT, 1, (LPARAM)(LPSTR)TEXT("    Пользователь: "));
}
//===================================================================================================
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    RECT rect, rcSB;    //Позиция и размеры главного окна и hStatusBar
    static int bmpWidth, bmpHeight;
    static HBITMAP hBitmap;      // дескриптор битового образа
    static LOGFONT lf1, lf2;
    static HFONT hFont1, hFont2;
    HDC hMemDC;                  // дескриптор совместимого контекста
    BITMAP bm;
    int sbHeight;       //Высота hStatusBar
    int dX, dY;
    int userReply;
    static TCHAR name[256] = "";
    static OPENFILENAME file;
    std :: ifstream in;
    std :: ofstream out;
    static std :: vector < std :: string > v;
    //std :: vector < std :: string > :: iterator it;
    std :: string st;
    
    switch (uMsg)
    {
    case WM_CREATE:
        {   
        // Создание строки состояния
        hStatusBar = CreateStatusWindow(WS_CHILD | WS_VISIBLE, "", hWnd, ID_STATUSBAR);
        if (hStatusBar==NULL) return FALSE;
        
        //Создание кнопки "Создать"
        hButton1 = CreateWindow ("BUTTON", "Создать", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | BS_BITMAP | BS_TEXT ,
            100, 100, 150, 100, hWnd, (HMENU)BTN1, NULL, NULL);
        //Загрузка изображени на кнопку
        HANDLE hBmpBut1 = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP2), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
        SendMessage(hButton1, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBmpBut1);
        //Изменение размера шрифта кнопки
        lf1.lfHeight = 28;
        lstrcpy((LPSTR)&lf1.lfFaceName, "Verdana");
        hFont1 = CreateFontIndirect(&lf1);
        SendMessage(hButton1, WM_SETFONT, (WPARAM)hFont1, TRUE);
        
        //Создание кнопки "Открыть"
        hButton2 = CreateWindow ("BUTTON", "Открыть", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | BS_BITMAP,
            100, 300, 150, 100, hWnd, (HMENU)BTN2, NULL, NULL);
        //Загрузка изображени на кнопку
        HANDLE hBmpBut2 = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP3), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
        SendMessage(hButton2, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBmpBut2);
        //Изменение размера шрифта кнопки
        lf2.lfHeight = 28;
        lstrcpy((LPSTR)&lf2.lfFaceName, "Verdana");
        hFont2 = CreateFontIndirect(&lf2);
        SendMessage(hButton2, WM_SETFONT, (WPARAM)hFont2, TRUE);
        
        hDC = GetDC(hWnd);
        //Загрузка изображения в клиентскую область
        hBitmap = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
        SendMessage(hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap);
 
        GetObject(hBitmap, sizeof(bm), &bm);
        bmpWidth = bm.bmWidth;
        bmpHeight = bm.bmHeight;
        // Подогнать размеры окна программы под размер растра hBitmap c учетом строки состояния
        GetClientRect(hWnd, &rect);
        GetWindowRect(hStatusBar, &rcSB);
        sbHeight = rcSB.bottom - rcSB.top;
        dX = bmpWidth - rect.right;
        dY = bmpHeight - rect.bottom + sbHeight;
        GetWindowRect(hWnd, &rect);
        InflateRect(&rect, dX/2, dY/2);
        MoveWindow(hWnd, rect.left, rect.top, rect.right-rect.left+300, rect.bottom-rect.top, TRUE);
        ReleaseDC(hWnd, hDC);
 
        //Заполнение структуры OPENFILENAME
        file.lStructSize     = sizeof(OPENFILENAME);
        file.hInstance       = hInst;
        file.lpstrFilter     = "Книга Excel 97-2003 (*.xls)\0*.xls";
        file.lpstrFile       = name;
        file.nMaxFile        = 256;
        file.lpstrInitialDir = ".\\";
        file.lpstrDefExt     = "xls";
        }
        break;
 
        SendMessage(hStatusBar, SB_SIMPLE, FALSE, 0);
    
    case WM_PAINT:
        hDC = BeginPaint(hWnd, &ps);
        // Создать совместимый контекст
        hMemDC = CreateCompatibleDC(hDC);
        // Выбрать hBitmap в совместимый контекст        
        SelectObject(hMemDC, hBitmap);
        // Скопировать изображение из hMemDC в hDC
        BitBlt(hDC, 300, 0, bmpWidth, bmpHeight, hMemDC, 0, 0, SRCCOPY);
        DeleteDC(hMemDC);
        EndPaint(hWnd, &ps);
        break;
 
    case WM_SIZE:
        StatusBar(hStatusBar);
        SendMessage (hStatusBar, WM_SIZE, wParam, lParam);
        break;
 
     case WM_COMMAND:
        switch(LOWORD(wParam))
        {
            // Нажата кнопка "Создать"
            case BTN1:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DialogBox1);
                break;
            // Нажата кнопка "Открыть"
            case BTN2:
                {
                //DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG2), hWnd, DialogBox2);
                file.lpstrTitle = "Открыть файл";
                file.Flags = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOTESTFILECREATE;
                if(!GetOpenFileName(&file)) return 1;
                out.open(name);
                while(getline(in, st)) v.push_back(st);
                out.close();
                InvalidateRect(hButton1, NULL, 1);
                break;
                }
            default:
                break;
        }
        InvalidateRect(hWnd, NULL, TRUE);
        break;
 
    case WM_CLOSE:
        userReply = MessageBox(hWnd, "Уже уходите?",
            "", MB_YESNO | MB_ICONQUESTION);
        if (IDYES == userReply)
            DestroyWindow(hWnd);
        break;
 
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
 
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}
//===================================================================================================
BOOL CALLBACK DialogBox1(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    int a[] = {IDC_STATIC1, IDC_STATIC2, IDC_STATIC3};
    static HWND hStatic;
    static LOGFONT lf;  // static для инициализации полей нулями
    static HFONT hFont;
 
    switch (uMsg) 
    { 
    case WM_INITDIALOG:
        for (int i = 0; i < 3; i++)
        {
        hStatic = GetDlgItem(hWnd, a[i]);
        // Создание логического шрифта Verdana
        lf.lfHeight = 30;
        lstrcpy((LPSTR)&lf.lfFaceName, "Times New Roman");
        hFont = CreateFontIndirect(&lf);
        // Модификация шрифта для элемента hStatic
        SendMessage(hStatic, WM_SETFONT, (WPARAM)hFont, TRUE );  
        }
 
    case WM_COMMAND: 
        switch (LOWORD(wParam)) 
        { 
            case ID_OK1:
                //case WM_CREATE:
                {
                //DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG2), hWnd, DialogBox2);
                // Создание дочернего окна
                hChild = CreateWindowEx (WS_EX_TOOLWINDOW, "KWndClassChild", "Табель учета рабочего времени", WS_CHILDWINDOW | WS_OVERLAPPED | WS_CAPTION, 
                    100, 100, 800, 600, hWnd, NULL, ::GetModuleHandle(NULL), NULL);
                if(!hChild) MessageBox(0, 0, 0, 0); // сигнализируем об ошибке
                ShowWindow(hChild, SW_SHOWNORMAL);
                break;
                }
 
            case ID_CANCEL1: 
                EndDialog(hWnd, 0);
                return TRUE;
            
            default:
                break;
        } 
        break;
            
    } 
    return FALSE; 
} 
//===================================================================================================
LRESULT CALLBACK ChildProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    RECT rect;
    PAINTSTRUCT ps;
    HDC hdc;
 
    switch (uMsg)
    {
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            // Вот и добавляем код рисования:
            GetClientRect(hWnd, &rect);
            DrawText(hdc, "This is a Child Window", -1, &rect,
                DT_SINGLELINE | DT_CENTER | DT_VCENTER);
            EndPaint(hWnd, &ps);
            break;
 
        case WM_CLOSE:
            DestroyWindow(hWnd);
            break;
 
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
 
        default:
            return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}
0
castaway
Эксперт С++
4946 / 3052 / 455
Регистрация: 10.11.2010
Сообщений: 11,147
Записей в блоге: 10
Завершенные тесты: 1
29.05.2012, 21:48 8
Я что-то не понял. Ты что, издеваешься?!
InitApplication() где у тебя вызывается!!!?? Как ты класс регистрируешь?
0
SpLoT
0 / 0 / 0
Регистрация: 27.05.2012
Сообщений: 5
30.05.2012, 13:28  [ТС] 9
Звиняй. это мое первое приложение. => я тя не очень понимаю.

Добавлено через 22 минуты
Все. доперло. пасиб
0
30.05.2012, 13:28
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2012, 13:28

Как реализовать работу с дисками компьютера в C++ Visual с использованием Win32 API
Доброго времени суток. У меня есть вопрос по реализации работы функции GetDiskFreeSpace. Я находил...

Не создается дочернее окно WIN32 Api
Не создается дочернее окно. Выдается ошибка: error LNK2019: ссылка на неразрешенный внешний символ...

Создание меню окна в Win32 API
Здравствуйте. Пожалуйсто помогите создать меню окна с помощью Win32 API! Не могу разобраться. :(


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.