掌握windows基於消息驅動的窗口應用程序設計的基本方法,掌握窗口程序資源的概念與設計,掌握常用的消息的程序處理方法,掌握文字圖形輸出相關函數編程。掌握設計的基本方法(選項),掌握時鍾消息設計動畫程序(選項)
利用windows基於消息驅動的窗口應用程序設計的基本方法,利用常用的消息程序處理方法,設計一個多線程程序,然后用時鍾動畫將各線程的執行過程直觀的表現出來。
操作環境:安裝有Windows操作系統PC機一台,實驗環境為VS(任何版本都行).
1.在vs中,生成一個空白的win32項目,了解win32的消息驅動,學習窗口程序資源的概念與設計,並為程序設計一個位圖圖標。
2. 觀察win32程序基本結構,了解常用的消息的程序處理方法,掌握文字圖形輸出相關函數編程,並練習文字與圖形的輸出。
3.設計並構建程序用戶界面
菜單欄
線程設置對話框
菜單與對話框函數如下:
// 分析菜單選擇:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
int pausecount;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜單選擇:
switch (wmId)
{
case IDM_ABOUT:
switch (DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About))
{
case IDSTART:
CreateThreadStart(hWnd);
//GetSecurityInfo
break;
case IDPAUSE:
pausecount=SuspendThread((HANDLE)ThreadId[treatwith]);
pausecount=SuspendThread(ThreadHandle[treatwith]);
if(pausecount==-1)
{
pausecount=GetLastError();
}
break;
case IDRESET:
pausecount=ResumeThread((HANDLE)ThreadId[treatwith]);
pausecount=ResumeThread(ThreadHandle[treatwith]);
if(pausecount==-1)
{
pausecount=GetLastError();
}
break;
}
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_SIZE:
wndWidthSize=LOWORD(lParam);
wndHighSize=HIWORD(lParam);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
//TextOut(hdc,100,50,_T("SOUTH WEST UNIVERSITY"),wcslen(_T("SOUTH WEST UNIVERSITY")));
// TODO: 在此添加任意繪圖代碼...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// "開始"對話框的消息處理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
if (LOWORD(wParam) == IDPAUSE)
{
treatwith=GetDlgItemInt(hDlg,IDC_EDIT2,NULL,TRUE);
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
if (LOWORD(wParam) == IDRESET)
{
treatwith=GetDlgItemInt(hDlg,IDC_EDIT2,NULL,TRUE);
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
if (LOWORD(wParam) == IDSTART)
{
threadNum=GetDlgItemInt(hDlg,IDC_EDIT1,NULL,TRUE);
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
4.編寫多線程創建函數,創建多個線程,編寫動畫繪圖函數繪制圖形,每個線程都調用繪圖函數,在用戶區中繪制動畫,以直觀表現線程的運行。具體代碼如下:
//線程創建
void CreateThreadStart(HWND hWnd)
{
bool SecurityDescriptorSuc=true;
threadStruct *pthreadparam;
UINT threadXuHao=0;
int i=0;
HANDLE handleRes;
while(threadXuHao<threadNum)
{
pthreadparam=new threadStruct;//到線程里面去釋放
pthreadparam->hWnd=hWnd;
pthreadparam->threadXuHao=threadXuHao;
if(SecurityDescriptorSuc==false)
{
//handleRes=CreateThread(&sa,0,PaintThread,
// (LPVOID)pthreadparam,0,&ThreadId[threadXuHao]);
ThreadHandle[threadXuHao]=handleRes;
}
else
{
handleRes=CreateThread(NULL,0,PaintThread,
(LPVOID)pthreadparam,0,&ThreadId[threadXuHao]);
ThreadHandle[threadXuHao]=handleRes;
}
threadXuHao++;
}
}
//繪圖
DWORD WINAPI PaintThread(LPVOID lpParam)
{
UINT threadXuHao=((threadStruct*)lpParam)->threadXuHao;
HWND hWnd=((threadStruct*)lpParam)->hWnd;
delete lpParam;
HDC hdc=GetDC(hWnd);
/*UINT currentHigh=wndHighSize-1;*/
wchar_t str[100];
swprintf(str,_T("this is the %d thread"),threadXuHao);
TextOut(hdc, 50 * (threadXuHao + 1) - 40 , 50 * (threadXuHao + 1) - 40 + (threadXuHao + 1) * 5, str, wcslen(str));
/*UINT rectWidth;
rectWidth=wndWidthSize/threadNum;*/
//HFONT X=CreateHfont
/*HPEN logicPen=CreatePen(PS_SOLID,3,logicColor[threadXuHao]);*/
HPEN logicPen = CreatePen(PS_SOLID, 3, RGB(50 * threadXuHao - 80, 20 * threadXuHao, 10*threadXuHao+150));
HPEN oldPenObj;
RECT rc;
GetClientRect(hWnd, &rc);
int n = 0;
int x=0;
int y = 0;
while (x<wndWidthSize)
{
x = 50 * (threadXuHao + 1) -40+150;
y = 50 * (threadXuHao+1)-40;
/*if (y > wndHighSize)
y -= wndHighSize;*/
int m = 10*(threadXuHao+1);
//MoveToEx(hdc,rectWidth*threadXuHao,currentHigh,NULL);
oldPenObj=(HPEN)SelectObject(hdc,(HGDIOBJ)logicPen);
//LineTo(hdc,(rectWidth-30)*(threadXuHao+1),currentHigh);
Ellipse(hdc, x+n ,y, x + m+n , y+m);
SelectObject(hdc,(HGDIOBJ)oldPenObj);
//currentHigh=currentHigh-3;
n += (threadXuHao + 1) * 5;
Sleep((threadXuHao+1)*200);
}
ReleaseDC(hWnd,hdc);
return 1;
}
五. 實驗結果
程序運行結果如下:
其中,進程3被暫停。