
не эксперт
  
Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate
Репутация: нет Всего: 19
|
| Код | /*Операторы препроцессора*/ #include <windows.h> //два файла с определениями, макросами #include <windowsx.h> //и прототипами функций Windows #include "resource.h" /*Прототипы используемых в программе функций пользователя*/
/*Обработка сообщений главного окна*/ LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //оконная функция void OnPaint(HWND); void OnCommand(HWND, int, HWND, UINT); void OnDestroy(HWND); //прототип функции OnDestroy
/*Общая функция для всех порожденных потоков*/ DWORD WINAPI Thread(LPVOID);
/*Обработка сообщений окон порожденных потоков*/ LRESULT CALLBACK ThreadWndProc(HWND, UINT, WPARAM, LPARAM); void ThreadOnPaint(HWND); void ThreadOnDestroy(HWND);
/*Глобальные переменные*/ char szClassName[] = "MainWindow"; //произвольное имя класса главного окна char szTitle[] = "Программа 12-3"; //произвольный заголовок окна
char szThreadClassName[] = "Thread"; //Имя класса окна порождаемых потоков char szThreadTitle[] = "Дочерний поток"; //Заголовок окон потоков
HINSTANCE hInstance; //Дескриптор экземпляра приложения HANDLE hThread; //Дескриптор создаваемого потока DWORD dwIDThread; //Идентификатор создаваемого потока int nCount; //Счетчик потоков /*Главная функция WinMain*/ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int) { MSG Msg; //структура Msg типа MSG для получения сообщений Windows WNDCLASS wc; //структура wc типа WNDCLASS для задания характеристик окна
hInstance = hInst; //Сохраним дескриптор экземпляра приложения
/*Зарегестрируем класс главного окна*/ ZeroMemory(&wc, sizeof(wc)); //Обнуление всех членов структуры wc wc.lpfnWndProc = WndProc; //Определяем оконную процедуру для главного окна wc.hInstance = hInst; //Дескриптор приложения wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //Стандартная пиктограмма wc.hCursor = LoadCursor(NULL, IDC_ARROW); //Стандартный курсор мыши wc.hbrBackground = GetStockBrush(WHITE_BRUSH); //Светло-серый фон окна wc.lpszClassName = szClassName; //Имя класса окна wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
RegisterClass(&wc); //Вызов функции Windows регистрации класса окна /*Зарегестрируем класс окна порожденного потока*/ wc.lpfnWndProc = ThreadWndProc; //Общая оконная функция всех потоков wc.lpszMenuName = NULL; //Меню у потоков небудет wc.hbrBackground = GetStockBrush(LTGRAY_BRUSH); //Цвет окон светло-серый wc.lpszClassName = szThreadClassName; //Имя класса окон потоков wc.cbWndExtra = 16; //Для номера потока и времени запуска RegisterClass(&wc); //Регистрируем класс окон порожденных потоков /*Создадим главное окно и сделаем его видимым*/ HWND hwnd = CreateWindow(szClassName, szTitle, WS_OVERLAPPEDWINDOW, 10, 10, 300, 100, HWND_DESKTOP, NULL, hInst, NULL); ShowWindow(hwnd, SW_SHOWNORMAL); //Вызов функции Windows показа окна /*Организуем цикл обнаружения сообщений*/ while (GetMessage(&Msg, NULL, 0, 0)) //Если есть сообщение, передать его нам DispatchMessage(&Msg); //и вызвать оконную процедуру WndProc return 0; //После выхода из цикла вернуться в Windows } /*Оконная функция WndProc главного окна (первичного потока)*/ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) //Переход по значению Msg - номеру сообщения { HANDLE_MSG(hwnd, WM_PAINT, OnPaint); HANDLE_MSG(hwnd, WM_COMMAND, OnCommand); HANDLE_MSG(hwnd, WM_DESTROY, OnDestroy); return 0; default : return (DefWindowProc(hwnd, msg, wParam, lParam)); } } /*Функция обработки сообщений WM_PAINT главного окна*/ void OnPaint(HWND hwnd) { char szT[30]; PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); wsprintf(szT, "Запущен поток #%d", nCount); if (hThread) //Если хоть один поток запущен TextOut(hdc, 160, 1, szT, strlen(szT)); //Вывести текст в главное окно EndPaint(hwnd, &ps); } /*Функция обработки сообщений WM_COMMAND для главного окна*/ void OnCommand(HWND hwnd, int id, HWND, UINT) { switch(id) { case ID_40001: nCount++; //Счетчик потоков hThread = CreateThread(NULL, 0, Thread, (LPVOID)nCount, 0, &dwIDThread); CloseHandle(hThread); //Закрываем дескриптор потока InvalidateRect(hwnd, NULL, TRUE); //Обновить главное окно break; case ID_40002: DestroyWindow(hwnd); } } void OnDestroy(HWND) { PostQuitMessage(0); //Вызов функции Windows завершения приложения } /*Общая для всех потоков рабочая функция потока*/ DWORD WINAPI Thread(LPVOID nCnt) { MSG msg; //Структурная переменная для сообщений потоков SYSTEMTIME SysTime; //Структурная переменная для местного времени HWND hwnd = CreateWindowEx(WS_EX_TOPMOST, "Thread", //Создадим окно потока "Порожденный поток", WS_OVERLAPPEDWINDOW, //Заголовок, стиль nCount * 40 + 50, nCount * 60 + 15, 220, 100, //Сдвиг окон потоков HWND_DESKTOP, NULL, hInstance, NULL); ShowWindow(hwnd, SW_NORMAL); //Покажем окно потока SetWindowLong(hwnd, 0, (LONG)nCnt); //Сохраним номер потока GetLocalTime(&SysTime); //Получим местное время SetWindowLong(hwnd, 4, (LONG)SysTime.wHour); //Сохраним часы SetWindowLong(hwnd, 8, (LONG)SysTime.wMinute); //Сохраним минуты SetWindowLong(hwnd, 12, (LONG)SysTime.wSecond); //Сохраним секунды while(GetMessage(&msg, NULL, 0, 0)); //Цикл обработки сообщений DispatchMessage(&msg); //Для окон всех потоков return 0; } /*Оконная процедура для окон потоков*/ LRESULT CALLBACK ThreadWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { HANDLE_MSG(hwnd, WM_PAINT, ThreadOnPaint); HANDLE_MSG(hwnd, WM_DESTROY, ThreadOnDestroy); default: return(DefWindowProc(hwnd, msg, wParam, lParam)); } } /*Функция обработки сообщений WM_PAINT для окон потоков*/ void ThreadOnPaint(HWND hwnd) { char szT[100]; PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps);
SetBkMode(hdc, TRANSPARENT); //Сделаем прозрачным фон символов wsprintf(szT, "Выполняется поток #%d", GetWindowLong(hwnd, 0)); //Заберем номер потока TextOut(hdc, 5, 1, szT, strlen(szT)); //Вывод строки wsprintf(szT, "Время запуска %d:%d:%d", GetWindowLong(hwnd, 4), //Заберем часы GetWindowLong(hwnd, 8), //Заберем минуты GetWindowLong(hwnd, 12)); //Заберем секунды TextOut(hdc, 5, 16, szT, strlen(szT)); //Вывод строки в окно EndPaint(hwnd, &ps); } /*Функция обработки сообщений WM_DESTROY для окон потоков*/ void ThreadOnDestroy(HWND) { PostQuitMessage(0); } |
Почему в окнах порожденных потоков не отображается информация? Причем каждое вновь созданное окно не реагирует должным образом на сообщения. Это сообщение отредактировал(а) S.A.G. - 22.10.2007, 16:55
--------------------
Вот она задачка: спасти себя от себя самого © CubeSometimes good people do evil things © A Simple Plan
|