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
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
| #include<Windows.h>
#include<WindowsX.h>
#include<CommCtrl.h>
#include<tchar.h>
#include <WinUser.h>
#define IDC_LIST 2001
#define IDC_BUTTON_ADD 2002
#define IDC_BUTTON_ADD2 2003
#define IDC_BUTTON_DEL 2004
#define IDC_BUTTON_FIND 2005
#define IDC_BUTTON_FONT 2006
#define IDC_TAB_CONTROL 2007
#define IDC_PROGRESS 2008
#define IDC_SPIN 2009
#define IDC_EDIT 2010
#define IDC_EDIT1 2011
#define IDC_BUTTON_MODAL3 2012
#define IDC_BUTTON_MODAL4 2013
#define IDC_BUTTON_MODAL2 2014
#define IDC_BUTTON_MODAL1 2015
#define IDC_RADIOBUTTON2 2016
#define IDC_DATATIMEPECKER1 2017
#define IDD_DIALOG1 2018
#define IDC_RADIOBUTTON1 2019
#define IDC_MYBUTTON1 2020
#define IDC_SYSLINK1 2021
#define IDC_STATIC1 2022
#define IDC_STATIC2 2023
#define IDC_STATIC3 2024
#define IDC_STATIC4 2025
#define IDC_STATIC5 2026
#define IDC_STATIC6 2027
#define IDC_STATIC7 2028
#define IDC_STATIC8 2029
#define IDC_STATIC9 2030
#define IDC_STATIC10 2031
#define IDC_STATIC11 2032
#define IDC_STATIC12 2033
#define IDC_TREEVIEW1 2034
#define ID_FORMAT_FONT 2035
#define IDI_TIMER1 2
#define TIMER 1
boolean flag = false;
#define WM_ADDITEM WM_USER + 1
int t = 0;
//ДЕСКРИПТОРЫ НЕМОДАЛЬНЫХ ДИАЛОГОВЫХ ОКОН
HWND hDlg = NULL;
HWND hFindDlg = NULL;
HWND hReplDlg = NULL;
HWND hwndTab = NULL;
HWND hwndPB = NULL;
HWND hwndTree = NULL;
TCHAR szBuffer[100] = TEXT("");
FINDREPLACE findDlg, repl;
UINT uFindMsgString = 0;
TCHAR szFindWhat[80];
TCHAR szBufferReplace[100] = TEXT("");
HFONT hFont = NULL;
//дескриптор открытого немодального диалогового окна
HWND hwndDlgCurrent = NULL;
//Оконная процедура главного окна
LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
HTREEITEM InsTreeItem(HTREEITEM hParent, LPWSTR szText, HTREEITEM hAfter, int iImage, int iSelectedImage);
//функция, вызываемая в цикле обработки сообщений, пока в очереди нет сообщений
void OnIdle(HWND hwnd);
//функция, вызываемая в цикле обработки сообщений, перед тем, как сообщение будет передано в оконную процедуру
BOOL PreTranslateMessage(LPMSG lpmsg);
//обработки сообщений главного окна
//обработчик WM_CREATE
BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct);
//WM_DESTROY
void OnDestroy(HWND hwnd);
//WM_SIZE
void OnSize(HWND hwnd, UINT state, int cx, int cy);
//WM_COMMAND
void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);
//WM_ADDITEM
void OnAddItem(HWND hwnd);
//FindMsgString
void OnFindMsgString(HWND hwnd, LPFINDREPLACE lpFindReplace);
//процедура диалогового окна
INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
//Обработчики сообщений диалогового окна
//WM_INITDIALOG
BOOL Dialog_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam);
//WM_CLOSE
void Dialog_OnClose(HWND hwnd);
//WM_COMMAND
void Dialog_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR lpszCmdLine, int nCmdShow)
{
//регистрация оконного класса главного окна
WNDCLASSEX myWindow = { sizeof(WNDCLASSEX) };
myWindow.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
myWindow.lpfnWndProc = MyWindowProc;
myWindow.hInstance = hInstance;
myWindow.hIcon = LoadIcon(NULL, IDI_APPLICATION);
myWindow.lpszMenuName = NULL;
myWindow.lpszClassName = TEXT("MyWindowClass");
myWindow.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if (0 == RegisterClassEx(&myWindow)) // регистрируем класс
{
// не удалось зарегистрировать новый оконный класс
return -1; // завершение работы приложения
}
// загрузка библиотеки элементов управления общего пользования
LoadLibrary(TEXT("ComCtl32.dll"));
// создание главного окна на основе нового оконного класса
HWND hwnd = CreateWindowEx(0, TEXT("MyWindowClass"), TEXT("Главное меню"),
WS_OVERLAPPEDWINDOW, 100, 100, 1000, 500, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow); // отображение главного окна ... цикл обработки сообщения ...
MSG msg;
BOOL bRet;
for (;;)
{
// определение наличия сообщений в очереди
while (!PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
}
// извлечение сообщения из очереди
bRet = GetMessage(&msg, NULL, 0, 0);
if (bRet == -1)
{/* обработка ошибки и возможно выход из цикла */
}
else if (FALSE == bRet)
{
break; // получено WM_QUIT, выход из цикла
}
else if (PreTranslateMessage(&msg) == FALSE)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
} // if
} // for
return (int)msg.wParam; // завершение работы приложения
} // _tWinMain
LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LPFINDREPLACE lpfr;
switch (uMsg)
{
case WM_CREATE: return HANDLE_WM_CREATE(hWnd, wParam, lParam, OnCreate);
case WM_DESTROY: return HANDLE_WM_DESTROY(hWnd, wParam, lParam, OnDestroy);
case WM_COMMAND: return HANDLE_WM_COMMAND(hWnd, wParam, lParam, OnCommand);
case WM_NOTIFY:
{
LPNMHDR lpnmhdr = (LPNMHDR)lParam;
if (lpnmhdr->code == NM_CLICK)
{
if (lpnmhdr->idFrom == IDC_SYSLINK1)
ShellExecute(NULL, TEXT("open"), TEXT("http://msdn.microsoft.com"), NULL, NULL, SW_SHOWDEFAULT);
}
return 0;
}
case WM_LBUTTONDBLCLK: SetDlgItemText(hWnd, IDC_STATIC11, TEXT("Двойной клик ЛКМ"));
SetTimer(hWnd, IDI_TIMER1, 5000, TIMERPROC(NULL));
return 0;
case WM_LBUTTONDOWN: SetDlgItemText(hWnd, IDC_STATIC11, TEXT("Нажал ЛКМ"));
SetTimer(hWnd, IDI_TIMER1, 5000, TIMERPROC(NULL));
return 0;
case WM_LBUTTONUP: SetDlgItemText(hWnd, IDC_STATIC12, TEXT("Отпустил ЛКМ"));
return 0;
case WM_MOUSEMOVE: SetDlgItemInt(hWnd, IDC_STATIC3, GET_X_LPARAM(lParam), TRUE);
SetDlgItemInt(hWnd, IDC_STATIC4, GET_Y_LPARAM(lParam), TRUE);
return 0;
case WM_SIZE: SetDlgItemInt(hWnd, IDC_STATIC1, GET_X_LPARAM(lParam), TRUE);
SetDlgItemInt(hWnd, IDC_STATIC2, GET_Y_LPARAM(lParam), TRUE);
return 0;
case WM_SYSKEYDOWN: SetDlgItemInt(hWnd, IDC_STATIC7, wParam, TRUE);
return 0;
case WM_SYSCHAR: SetDlgItemInt(hWnd, IDC_STATIC8, wParam, TRUE);
return 0;
case WM_TIMER: SetDlgItemText(hWnd, IDC_STATIC11, TEXT("Нажатие ЛКМ"));
SetDlgItemText(hWnd, IDC_STATIC12, TEXT("Отпускание ЛКМ"));
return 0;
} // switch
if (uFindMsgString == uMsg) // сообщение FINDMSGSTRING
{
lpfr = (LPFINDREPLACE)lParam;
if (lpfr->Flags & FR_DIALOGTERM)
{
hwndDlgCurrent = NULL;
return 0;
}
} // if
// передача необработанного сообщения оконной процедуре по умолчанию
return DefWindowProc(hWnd, uMsg, wParam, lParam);
} // MyWindowProc
INT_PTR CALLBACK Dialog1Proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG: return HANDLE_WM_INITDIALOG(hwndDlg, wParam, lParam, Dialog_OnInitDialog);
case WM_CLOSE: HANDLE_WM_CLOSE(hwndDlg, wParam, lParam, Dialog_OnClose);
return true;
case WM_COMMAND: HANDLE_WM_COMMAND(hwndDlg, wParam, lParam, Dialog_OnCommand);
return true;
}
return false;
}
void OnIdle(HWND hwnd)
{
/* обработка каких-либо данных */
} // OnIdle
BOOL PreTranslateMessage(LPMSG lpMsg)
{
return (NULL != hwndDlgCurrent) && IsDialogMessage(hwndDlgCurrent, lpMsg);
} // PreTranslateMessage
BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
{
LoadLibrary(TEXT("Comctl32.dll"));
// создание гиперссылки
CreateWindowEx(0, WC_LINK, TEXT("<a>msdn.microsoft.com</a>"), WS_CHILD | WS_VISIBLE, 260, 470, 140, 20, hwnd, (HMENU)IDC_SYSLINK1, lpCreateStruct->hInstance, NULL);
// создание списка
CreateWindowEx(0, TEXT("ListBox"), NULL,
WS_CHILD | WS_VISIBLE | WS_BORDER | LBS_STANDARD, 0, 0, 250, 480, hwnd, (HMENU)IDC_LIST, lpCreateStruct->hInstance, NULL);
// создание кнопки "Добавить запись"
CreateWindowEx(0, TEXT("Button"), TEXT("Добавить запись"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 260, 10, 150, 25, hwnd, (HMENU)IDC_BUTTON_ADD, lpCreateStruct->hInstance, NULL);
// создание кнопки "Удалить запись"
CreateWindowEx(0, TEXT("Button"), TEXT("Удалить запись"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 260, 45, 150, 25, hwnd, (HMENU)IDC_BUTTON_DEL, lpCreateStruct->hInstance, NULL);
// создание кнопки "Найти запись"
CreateWindowEx(0, TEXT("Button"), TEXT("Найти запись"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 260, 80, 150, 25, hwnd, (HMENU)IDC_BUTTON_FIND, lpCreateStruct->hInstance, NULL);
// создание кнопки "Шрифт"
CreateWindowEx(0, TEXT("Button"), TEXT("Шрифт"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 260, 115, 150, 25, hwnd, (HMENU)ID_FORMAT_FONT, lpCreateStruct->hInstance, NULL);
// создание поля даты или времени
CreateWindowEx(0, TEXT("SysDateTimePick32"), TEXT("Поле ввода даты или времени"), WS_VISIBLE | WS_CHILD | WS_TABSTOP, 260, 150, 150, 25, hwnd, (HMENU)IDC_DATATIMEPECKER1, lpCreateStruct->hInstance, NULL);
// создание переключателя 1
CreateWindowEx(0, TEXT("Button"), TEXT("Переключатель 1"), WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_AUTORADIOBUTTON, 430, 80, 150, 25, hwnd, (HMENU)IDC_RADIOBUTTON1, lpCreateStruct->hInstance, NULL);
// создание переключателя 2
CreateWindowEx(0, TEXT("Button"), TEXT("Переключатель 2"), WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_AUTORADIOBUTTON, 430, 110, 150, 25, hwnd, (HMENU)IDC_RADIOBUTTON2, lpCreateStruct->hInstance, NULL);
// создание дерева просмотра
hwndTree = CreateWindowEx(WS_EX_STATICEDGE, TEXT("SysTreeView32"), TEXT("Дерево просмотра"), WS_VISIBLE | WS_CHILD | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_HASLINES, 5, 5, 240, 470, hwnd, (HMENU)IDC_TREEVIEW1, lpCreateStruct->hInstance, NULL);
HTREEITEM hItem = InsTreeItem((HTREEITEM)TVI_ROOT, LPWSTR("Мои письма"), (HTREEITEM)TVI_FIRST, 0, 0);
HTREEITEM hItem1 = InsTreeItem(hItem, LPWSTR("Входящие"), (HTREEITEM)TVI_SORT, 0, 0);
HTREEITEM hItem2 = InsTreeItem(hItem, LPWSTR("Исходящие"), (HTREEITEM)TVI_SORT, 0, 0);
InsTreeItem(hItem1, LPWSTR("Прочитанные"), (HTREEITEM)TVI_SORT, 0, 0);
InsTreeItem(hItem1, LPWSTR("Непрочитанные"), (HTREEITEM)TVI_SORT, 0, 0);
InsTreeItem(hItem2, LPWSTR("Отправленные"), (HTREEITEM)TVI_SORT, 0, 0);
InsTreeItem(hItem2, LPWSTR("Черновики"), (HTREEITEM)TVI_SORT, 0, 0);
//progress bar
hwndPB = CreateWindowEx(0, PROGRESS_CLASS, NULL,
WS_CHILD | WS_VISIBLE | PBS_SMOOTH | WS_BORDER, 650, 115, 150, 25, hwnd, (HMENU)IDC_PROGRESS, lpCreateStruct->hInstance, NULL);
SendMessage(hwndPB, PBM_SETRANGE, 0, (LPARAM)MAKELONG(0, 10));
//SendMessage(hwndPB, PBM_SETSTEP,(WPARAM)1,0);
UpdateWindow(hwndPB);
//spin control+edit1
HWND Edit1 = CreateWindowEx(0, TEXT("Edit"), TEXT("0"),
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_CENTER | ES_NUMBER, 650, 80, 150, 25, hwnd, (HMENU)IDC_EDIT, lpCreateStruct->hInstance, NULL);
CreateUpDownControl(WS_CHILD | WS_VISIBLE | UDS_ALIGNRIGHT | UDS_SETBUDDYINT | UDS_AUTOBUDDY | UDS_ARROWKEYS,
0, 0, 20, 0, hwnd, IDC_SPIN, lpCreateStruct->hInstance, Edit1, 100, 0, 0);
//TIMER
CreateWindowEx(0, TEXT("Button"), TEXT("Включить таймер"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 650, 10, 150, 25, hwnd, (HMENU)IDC_BUTTON_MODAL3, lpCreateStruct->hInstance, NULL);
CreateWindowEx(0, TEXT("Button"), TEXT("Отключить таймер"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 650, 45, 150, 25, hwnd, (HMENU)IDC_BUTTON_MODAL4, lpCreateStruct->hInstance, NULL);
//открыть
CreateWindowEx(0, TEXT("Button"), TEXT("Диалоговое окно Открыть"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 430, 10, 200, 25, hwnd, (HMENU)IDC_BUTTON_MODAL2, lpCreateStruct->hInstance, NULL);
CreateWindowEx(0, TEXT("Button"), TEXT("Диалоговое окно Заменить"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 430, 45, 200, 25, hwnd, (HMENU)IDC_BUTTON_MODAL1, lpCreateStruct->hInstance, NULL);
return TRUE;
} // OnCreate
void OnDestroy(HWND hwnd)
{
// удаление созданного шрифта
if (NULL != hFont)
DeleteObject(hFont), hFont = NULL;
PostQuitMessage(0); // отправка сообщения WM_QUIT
} // OnDestroy
void OnSize(HWND hwnd, UINT state, int cx, int cy)
{
if (state != SIZE_MINIMIZED)
{
// получение дескриптора списка
HWND hwndCtl = GetDlgItem(hwnd, IDC_LIST);
// изменение высоты списка
MoveWindow(hwndCtl, 15, 15, 250, cy - 25, TRUE);
} // if
} // OnSize
void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
if (BN_CLICKED == codeNotify)
{
// получение дескриптора экземпляра приложения
HINSTANCE hInstance = GetWindowInstance(hwnd);
switch (id)
{
case IDC_BUTTON_MODAL1:
{
HWND hdlg = NULL; // десткриптор диалога поиска текста
memset(szFindWhat, 0, _countof(szFindWhat));
// Заполнение FINDREPLACE
if (0 == uFindMsgString)
{
// получение кода сообщения FINDMSGSTRING
uFindMsgString = RegisterWindowMessage(FINDMSGSTRING);
} // if
if (IsWindow(hReplDlg) == FALSE)
{
repl.lStructSize = sizeof(FINDREPLACE);
repl.hInstance = hInstance;
repl.hwndOwner = hwnd;
repl.lpstrFindWhat = szFindWhat;
repl.wFindWhatLen = _countof(szFindWhat);
repl.lpstrReplaceWith = szBufferReplace;
repl.wReplaceWithLen = _countof(szBufferReplace);
repl.wFindWhatLen = 80;
repl.Flags = 0;
// создание диалогового окна "Найти"
hReplDlg = ReplaceText(&repl);
}
}
break;
case ID_FORMAT_FONT:
{
CHOOSEFONT font = { sizeof(CHOOSEFONT) };
font.hInstance = hInstance;
font.hwndOwner = hwnd;
LOGFONT lf;
ZeroMemory(&lf, sizeof(lf));
font.lpLogFont = &lf; // используемая структура для создания шрифта
BOOL bRet = ChooseFont(&font);
if (FALSE != bRet)
{
HFONT hNewFont = CreateFontIndirect(font.lpLogFont);
if (NULL != hNewFont)
{
if (NULL != hFont) DeleteObject(hFont); //удаление созданного шрифта
hFont = hNewFont;
SendDlgItemMessage(hwnd, IDC_LIST, WM_SETFONT, (WPARAM)hFont, (LPARAM)TRUE);
}
}
break;
}
case IDC_BUTTON_MODAL2:
OPENFILENAME ofn; // структура диалога открытия файла
TCHAR szFile[MAX_PATH]; // буфер для имени файла
memset(szFile, 0, _countof(szFile));
HANDLE hf;// дескриптор файла
// Заполнение OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = _T("All\0*.*\0Text\0*.TXT\0");
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
// Показ диалога открытия файла.
if (GetOpenFileName(&ofn) == TRUE)
hf = CreateFile(ofn.lpstrFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL);
break;
case IDC_BUTTON_ADD: // нажата кнопка "Добавить запись"
{
// создание модального диалогового окна
int nDlgResult = DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hwnd, DialogProc);
if (IDOK == nDlgResult)
{
// отправка окну сообщение о том, что нужно добавить запись
MessageBox(hwnd, TEXT("Нажата кнопка ОК"), TEXT("Диалоговое окно"), MB_OK | MB_ICONINFORMATION);
} // if
}
break;
case IDC_BUTTON_DEL: // нажата кнопка "Удалить запись"
{
// получение дескриптор списка
HWND hwndCtl = GetDlgItem(hwnd, IDC_LIST);
// определение текущего выделенного элемента в списке
int iItem = ListBox_GetCurSel(hwndCtl);
if (iItem != -1)
{
int mbResult = MessageBox(hwnd, TEXT("Удалить выбранный элемент?"), TEXT("SampleWin32"), MB_YESNO | MB_ICONQUESTION);
if (mbResult == IDYES)
{
// удаление выделенного элемента из списка
ListBox_DeleteString(hwndCtl, iItem);
} // if
} // if
}
break;
case IDC_BUTTON_FIND: // нажата кнопка "Найти запись"
if (0 == uFindMsgString)
{
// получение кода сообщения FINDMSGSTRING
uFindMsgString = RegisterWindowMessage(FINDMSGSTRING);
} // if
// если диалоговое окно "Найти" еще не создано
if (IsWindow(hFindDlg) == FALSE)
{
findDlg.lStructSize = sizeof(FINDREPLACE);
// указывание дескриптора экземпляра приложения
findDlg.hInstance = hInstance;
// указывание дескриптор окна владельца
findDlg.hwndOwner = hwnd;
// указывание строкового буфера
findDlg.lpstrFindWhat = szBuffer;
// указывание размера буфера
findDlg.wFindWhatLen = _countof(szBuffer);
// создание диалогового окно "Найти"
hFindDlg = FindText(&findDlg);
} // if
break;
case IDC_BUTTON_MODAL3:
SendMessage(hwndPB, PBM_SETSTEP, (WPARAM)1, 0);
SendMessage(hwndPB, PBM_STEPIT, 0, 0);
int timeID;
timeID = SetTimer(hwnd, TIMER, 1000, NULL);
if (timeID == 0)
MessageBox(NULL, TEXT("Не удалось начать загрузку"), TEXT("Таймер"), MB_OK | MB_ICONWARNING);
else
MessageBox(NULL, TEXT("Загрузка начата"), TEXT("Таймер"), MB_OK | MB_ICONWARNING);
break;
case IDC_BUTTON_MODAL4:
KillTimer(hwnd, TIMER);
t++;
MessageBox(NULL, TEXT("Загрузка прервана"), TEXT("Таймер"), MB_OK | MB_ICONWARNING);
break;
// отображание немодального диалогового окна
ShowWindow(hwndDlgCurrent, SW_SHOW);
break;
} // switch
} // if
} // OnCommand
void OnAddItem(HWND hwnd)
{
// получение дескриптора списка
HWND hwndCtl = GetDlgItem(hwnd, IDC_LIST);
// добавление нового элемента в список
int iItem = ListBox_AddString(hwndCtl, szBuffer);
// вставка нового элемента
ListBox_SetCurSel(hwndCtl, iItem);
} // OnAddItem
void OnFindMsgString(HWND hwnd, LPFINDREPLACE lpFindReplace)
{
if (lpFindReplace->Flags & FR_FINDNEXT) // нажата кнопка "Найти далее"
{
// получение дескриптора списка
HWND hwndCtl = GetDlgItem(hwnd, IDC_LIST);
// определение текущего выделенного элемента в списке
int iItem = ListBox_GetCurSel(hwndCtl);
// поиск указанного текста в списке
// сразу после текущего выделенного элемента
iItem = ListBox_FindString(hwndCtl, iItem, lpFindReplace->lpstrFindWhat);
// выделение найденного элемента
ListBox_SetCurSel(hwndCtl, iItem);
if (LB_ERR == iItem) // элемент не найден
{
MessageBox(hFindDlg, TEXT("Поиск завершен"), TEXT("SampleWin32"), MB_OK | MB_ICONINFORMATION);
} // if
} // if
} // OnFindMsgString
INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
{
BOOL bRet = HANDLE_WM_INITDIALOG(hwndDlg, wParam, lParam, Dialog_OnInitDialog);
return SetDlgMsgResult(hwndDlg, uMsg, bRet);
}
case WM_CLOSE:
HANDLE_WM_CLOSE(hwndDlg, wParam, lParam, Dialog_OnClose);
return TRUE;
case WM_COMMAND:
HANDLE_WM_COMMAND(hwndDlg, wParam, lParam, Dialog_OnCommand);
return TRUE;
} // switch
return FALSE;
} // DialogProc
BOOL Dialog_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
// получение дескриптора окна редактируемого поля
HWND hwndEdit = GetDlgItem(hwnd, IDC_EDIT1);
// задавание максимальной длины текста в редактируемом поле
Edit_LimitText(hwndEdit, _countof(szBuffer) - 1);
// задавание серого (фонового) текста в редактируемом поле
Edit_SetCueBannerText(hwndEdit, L"Название новой записи");
return TRUE;
} // Dialog_OnInitDialog
void Dialog_OnClose(HWND hwnd)
{
if (hwnd == hDlg)
{
// удаление немодального диалогового окна
DestroyWindow(hwnd);
} // if
else
{
// завершение работы модального диалогового окна
EndDialog(hwnd, IDCLOSE);
} // else
} // Dialog_OnClose
void Dialog_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
if (BN_CLICKED == codeNotify) // была нажата кнопка
{
switch (id)
{
case IDOK: // нажата кнопка "ОК"
{
// получение содержимого редактируемого поля
int cch = GetDlgItemText(hwnd, IDC_EDIT1, szBuffer, _countof(szBuffer));
if (0 == cch) // в редактируемого поле нет текста
{
// получение дескриптора окна редактируемого поля
HWND hwndEdit = GetDlgItem(hwnd, IDC_EDIT1);
EDITBALLOONTIP ebt = { sizeof(EDITBALLOONTIP) };
ebt.pszTitle = L"SampleWin32";
ebt.pszText = L"Укажите название новой записи";
ebt.ttiIcon = TTI_WARNING;
Edit_ShowBalloonTip(hwndEdit, &ebt);
} // if
else if (hwnd == hDlg)
{
// очистка редактируемого поля
SetDlgItemText(hwnd, IDC_EDIT1, TEXT(""));
// отправка окну-владельцу сообщение о том, что нужно добавить запись
SendMessage(GetParent(hwnd), WM_ADDITEM, 0, 0);
} // if
else
{
// завершение работы модального диалогового окна
EndDialog(hwnd, IDOK);
} // else
} // if
break;
case IDCANCEL: // нажата кнопка "Отмена"
if (hwnd == hDlg)
{
// уничтожение немодального диалогового окна
DestroyWindow(hwnd);
} // if
else
{
// завершение работы модального диалогового окна
EndDialog(hwnd, IDCANCEL);
} // else
break;
} // switch
} // if
} // Dialog_OnCommand
HTREEITEM InsTreeItem(HTREEITEM hParent, LPWSTR szText, HTREEITEM hAfter, int iImage, int iSelectedImage)
{
TV_INSERTSTRUCT tvins;
HTREEITEM hItem;
memset(&tvins, 0, sizeof(tvins));
tvins.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
tvins.item.pszText = szText;
tvins.item.cchTextMax = lstrlen(szText);
tvins.item.iImage = iImage;
tvins.item.iSelectedImage = iSelectedImage;
tvins.hInsertAfter = hAfter;
tvins.hParent = hParent;
hItem = TreeView_InsertItem(hwndTree, &tvins);
return hItem;
} |