Опытный
 
Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород
Репутация: нет Всего: нет
|
Привет вот моя мини прога | Код | #include <windows.h> #include <windowsx.h> #include <time.h> #include "1.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) { LPSTR lpszClassName = "MainWindow"; LPSTR lpszTitle = "Программа 12-5"; hInst = hInstance; MSG msg; WNDCLASS wc = {0};
// Инициализация и регистрация структуры wc класса MainWindow (первичного потока) wc.lpfnWndProc = WndProc; wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hInstance = hInstance; wc.hbrBackground = GetStockBrush(LTGRAY_BRUSH); wc.lpszClassName = lpszClassName; RegisterClass(&wc);
// Инициализация и регистрация структуры wc класса Thread1 (вторичного потока) wc.lpfnWndProc = Thread1WndProc; wc.lpszClassName = lpszThread1ClassName; RegisterClass(&wc);
hwndMain = CreateWindowEx(WS_EX_TOPMOST,lpszClassName,lpszTitle,WS_BORDER | WS_SYSMENU,10,10,375,70,HWND_DESKTOP,NULL,hInstance,NULL); ShowWindow(hwndMain,SW_NORMAL);
while (GetMessage(&msg,NULL,0,0)) { DispatchMessage(&msg); } return 0; }
// Описание функций главного окна (первичного потока) LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { switch(msg) { HANDLE_MSG(hwnd,WM_CREATE,OnCreate); HANDLE_MSG(hwnd,WM_PAINT,OnPaint); HANDLE_MSG(hwnd,WM_TIMER,OnTimer); HANDLE_MSG(hwnd,WM_DESTROY,OnDestroy); default: return DefWindowProc(hwnd,msg,wParam,lParam); } }
BOOL OnCreate(HWND hwnd,LPCREATESTRUCT) { OnTime(); SetTimer(hwnd,1000,0,NULL);
// Создаем 3 потока CreateThread(NULL,0,Thread1,NULL,0,NULL); CreateThread(NULL,0,Thread2,NULL,0,NULL); return TRUE; }
void OnPaint(HWND hwnd) { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd,&ps); SetBkMode(hdc,TRANSPARENT);
TextOut(hdc,5,0,lpszCurrentTime,strlen(lpszCurrentTime));
EndPaint(hwnd,&ps); }
void OnTimer(HWND,UINT) { OnTime(); }
void OnDestroy(HWND) { KillTimer(hwndMain,0); PostQuitMessage(0); }
// Описание функций первисного потока LRESULT CALLBACK Thread1WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { return DefWindowProc(hwnd,msg,wParam,lParam); }
DWORD WINAPI Thread1(LPVOID) { MSG msg; HWND hwnd = CreateWindowEx(WS_EX_TOPMOST,lpszThread1ClassName,NULL,WS_BORDER | WS_POPUP,10,80,230,185,HWND_DESKTOP,NULL,hInst,NULL); ShowWindow(hwnd,SW_NORMAL);
srand(time(NULL)); SetTimer(hwnd,0,100,Thread1TimerProc);
while (GetMessage(&msg,NULL,0,0)) { DispatchMessage(&msg); } return 0; }
void CALLBACK Thread1TimerProc(HWND hwnd,UINT,UINT,DWORD) { char szText[] = "Набор данных"; // Текст в окне
int y = 60 + rand() % 10; HDC hdc = GetDC(hwnd);
SetBkMode(hdc,TRANSPARENT); TextOut(hdc,10,10,szText,strlen(szText));
Rectangle(hdc,x,y,x+2,y+2); x+=2; if (x>=220) { x = 0; [color=red]InvalidateRect(hwnd,NULL,TRUE);[/color] }
ReleaseDC(hwnd,hdc); }
DWORD WINAPI Thread2(LPVOID) { return 0; }
// Другие функции void OnTime() { SYSTEMTIME st; GetLocalTime(&st);
wsprintf(lpszCurrentTime,"%02d : %02d : %02d",st.wHour,st.wMinute,st.wSecond); InvalidateRect(hwndMain,NULL,TRUE); }
|
| Код | "1.h"
// Глобальные переменные HINSTANCE hInst; HWND hwndMain; LPSTR lpszThread1ClassName = "Thread1"; char lpszCurrentTime[40]; int x;
// Прототипы функций главного окна (первичного потока) LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); BOOL OnCreate(HWND,LPCREATESTRUCT); void OnPaint(HWND); void OnTimer(HWND,UINT); void OnDestroy(HWND);
// Прототипы функций первичного потока DWORD WINAPI Thread1(LPVOID); LRESULT CALLBACK Thread1WndProc(HWND,UINT,WPARAM,LPARAM); void CALLBACK Thread1TimerProc(HWND,UINT,UINT,DWORD);
// Прототипы функций вторичного потока DWORD WINAPI Thread2(LPVOID);
// Другие функции void OnTime(void);
|
| Код | "файл ресурсов"
#include <windows.h> #include "resource.h"
Files DIALOG 120, 40, 69, 80 CAPTION "Поиск файлов" { CONTROL "", ID_LIST,"LISTBOX",WS_VSCROLL | WS_BORDER,3,4,61,60 }
|
| Код | "resource.h" #define ID_LIST 100
|
подскажите Я не понимаю почему когда Я в функции Thread1TimerProc посылаю сообщение InvalidateRect() о перерисовке окна, то у меня окно и правда перерисовывается. Ведь сообщение WM_PAINT для этого потока обрабатывается по умолчанию. Как винда знает что у меня там нарисовано? P.S: Если что в коде не понятно спрашивайте. Это сообщение отредактировал(а) yngwie19 - 6.4.2009, 21:35
|