一、簡答題
1、在文檔/視圖結構的應用程序中,視圖類對象是如何獲取文檔類對象中數據的
答:通過GetDocument()函數
2、假設建立一個工程名為MyPrj的工程,利用MFC AppWizard生成文檔/視圖結構應用程
序框架的4個MFC派生類,簡述這四個類名和它們的功能。
答:
(1)CMyPrjApp應用程序類:應用程序的起點,負責應用程序的啟動。
(2)CMyPrjFrame框架窗口類:應用程序的框架窗口。
(3)CMyPrjView視圖類:專門用來堆應用程序的數據進行顯示。
(4)CMyPrjDoc文檔類:保存程序中的數據成員,對程序中的數據進行管理。
3、在Windows程序設計中,如何顯示和更新窗口?
答:調用windows系統函數ShowWindow( )顯示窗口,UpdateWindow( )更新窗口。
4、試說明以下是什麼句柄?
(1)HWND :窗口句柄
(2)HINSTANCE :當前應用程序實例句柄
(3)HDC :設備上下文句柄
5、Windows應用程序的主要函數有哪3個主要任務?
答:注冊窗口類、創建應用程序的窗口和建立消息循環。
6、在窗口類CFrameWnd中需要封裝哪些成員?
答:在窗體類CFrameWnd中需要封裝窗口句柄hWnd、窗口類型屬性的定義、窗口類型的注冊、窗口的創建和顯示更新窗口。
7、應用程序類CWinApp應該具備哪些主要功能?
答:在CWinApp中主要有兩個功能,一是調用成員函數InitInstance()來完成窗口的設計、注冊、創建和顯示工作;二是調用成員函數Run()來實現消息循環。
8、在MFC中CDC的派生類有哪幾個?試說出它們的作用?
答:(1)CPaintDC類:在WM_PAINT消息的處理函數OnDraw中使用的窗口用戶區的設備描述環境。只能在視圖類的OnDraw()函數中使用。
(2)CClientDC:應用在除WM_PAINT之外的消息處理函數中。可以在除OnDraw()函數之外的任何地方使用。
(3)CWindowDC:提供整個窗口類繪圖的設備描述環境。表示的是整個窗口。
(4)CMetaFileDC:代表windows圖元文件的設備描述環境。
9、在CDC中,如何把自己建立的繪圖工具載入設備描述環境?
答:
10、如何使用CDC類提供的繪圖方法繪圖?
答:直接使用CDC類型的指針變量,調用繪圖函數進行繪圖。
11、在MFC中,應用程序的界面有哪3種方式?
答:題目說的不明不白,我猜測是單文檔、多文檔、對話框這三種吧。
12、分別說明什麼是SDI界面的程序和什麼是MDI界面的程序?
答:
單文檔:在單文檔界面的應用程序中,任何一時刻只能操作一個文檔。
多文檔:在多文檔界面的應用程序中,用戶可以同時操作多個文件。
13、文檔類的成員函數UpdateAllViews的作用是什麼?
答:文檔對應多個視圖時,更新所有視圖,它是通過調用每個視圖類的OnUpdate()函數來更新所有與文本關聯的視圖。
14、常用的客戶區鼠標消息有哪些?(注意:只考慮鼠標兩鍵情況,即只有鼠標左鍵和右鍵)
答:
WM_LBUTTONDBLCLK :鼠標左鍵雙擊
WM_LBUTTONDOWN :鼠標左鍵按下
WM_LBUTTONUP :鼠標左鍵松開
WM_RBUTTONDBLCLK :鼠標右鍵雙擊
WM_RBUTTONDOWN :鼠標右鍵按下
WM_RBUTTONUP :鼠標右鍵松開
15、程序運行時,用戶選中一個菜單項,會發出那種消息?根據什麼來判斷消息源?
答:用戶選中菜單項時,會發出WM_COMMAND消息。系統根據菜單項的標識ID來判斷消息源。
16、為什麼在Windows應用程序中不直接使用鍵盤的掃描碼而使用與鍵盤無關的虛擬碼,怎樣理解Windows中設備無關性這個概念,設備無關性對編寫應用程序有什麼作用。
答:
為了方便程序設計,windows為每個按鍵都提供了相應的與設備無關的編碼,這個編碼便稱為虛擬碼。因此在windows應用程序的編寫中,用戶可以忽略掃描碼,而直接使用虛擬鍵來對鍵盤進行操作。
鍵盤的掃描碼是當用戶直接敲擊鍵盤上的按鍵時,由鍵盤的接口直接產生的與該鍵對應的一種編碼。由於市面上的鍵盤種類很多,所以不同類型的鍵盤產生的掃描碼有可能是不同的,也就是說,這種掃描碼是與具體的鍵盤相關的。這樣在編寫程序時會有很大的不便。所以在Windows編程中提出了設備無關性這個概念,它是基於通用性來設計的,基於這種方法設計出來的程序是不依賴於具體的硬件的,甚至不依賴於軟件。它不單單是針對鍵盤。另外,它還應用在網絡通信等方面。因此,設備無關性為人們編寫程序帶來了很大的方便。
17、在 MSG 結構類型中,第一個成員所代表的含義是什麼?
MSG 結構類型定義如下:
typedef struct tagMSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG, *PMSG
答:HWND hwnd; hwnd是窗口句柄。第一個成員變量hwnd表示消息所屬的窗口。在Windows程序中,用HWND類型的變量來標識窗口。
18、簡述在MFC中使用位圖資源的步驟?
答:准備好ICON圖表文件 ,在VC++中,Project | Add to Project | Files, 選擇圖表文件 → 在資源文件中添加如下描述句:程序資源的ID ICON【選項】 “資源文件路徑”
1)把位圖資源載入位圖對象;
2)獲得位圖信息;
3)把位圖選入內存設備環境;
4)顯示位圖。
19、GetMessage()函數在什麼情況下返回0,從而導致消息循環終止程序結束。
答:在接收到WM_QUIT消息時返回0。
20、在 WNDCLASSEX 結構類型中,各個成員所代表的含義是什麼?
WNDCLASSEX 結構類型定義如下:
typedef struct _WNDCLASSEX
{ UINT cbSize; //窗口的大小
UINT style; //窗口的樣式
WNDPROC lpfnWndProc; //表示指向窗口函數的指針
int cbClsExtra; //表示窗口類附加字節
int cbWndExtra; //表示窗口類字節
HINSTANCE hInstance; //表示當前應用程序實例句柄
HICON hIcon; //表示指定窗口的圖標
HCURSOR hCursor; //用於指定窗口的光標
HBRUSH hbrBackground; //用於指定窗口的背景顏色
LPCTSTR lpszMenuName; //用於指定窗口的菜單資源名
LPCTSTR lpszClassName; //用於指定窗口的類名
HICON hIconSm; //窗口類關聯的小圖標
} WNDCLASSEX
21、簡述自定義消息的步驟?
答:
第一步:定義消息。開發Windows應用程序時,Microsoft推薦用戶自定義消息至少是WM_USER+100,因為很多新控件也要使用WM_USER消息。
第二步:在類頭文件的AFX_MSG塊中說明消息處理函數。
第三步:實現消息處理函數。該函數使用WPRAM和LPARAM參數並返回LPESULT。
第四步:在用戶類的消息塊中,使用ON_MESSAGE宏指令將消息映射到消息處理函數中。
22、簡述模態對話框與非模態對話框的區別?
答:
(1). 模式對話框就是不處理它就沒法處理父窗口,而非模式對話框就是不用先處理此對話框也可以處理父窗口.
(2). 模式對話框一般是使用DoModal,而非模式對話框的創建則是使用Create。
(3). 模式對話框的銷毀是使用EndDialog,而非模式對話框的銷毀是使用DestroyWindow。
二、編寫程序(編程題已經打包上傳, 點擊下載)
1、編寫一個應用程序,使用CDC類的TextOut函數在屏幕坐標(100,100)的位置輸出“Hello World”字符串?
答:在於OnDraw函數中寫入如下代碼:
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(100,100,"Hello World");
}
答:已做
2、編寫一個單文檔應用程序,程序啟動後在用戶區顯示一個矩形,當用鼠標左鍵單擊用戶區後,該矩形變成橢圓形,如果再單擊則變成矩形,以此循環。
答:(1)在視圖類聲明定義成員變量
private:
CRect m_rectRec;
BOOL m_bKey;
(2)在視圖類的構造函數中對成員變量進行初始化
CMyView::CMyView()
{
m_bKey=FALSE;
m_rectRec.left=100;
m_rectRec.top=100;
m_rectRec.bottom=400;
m_rectRec.right=400;
}
(3)在視圖類鼠標左鍵按下消息中添加相應代碼:
void CMyView::OnLButtonDown(UINT nFlags, CPoint point)
{
if(m_bKey)
m_bKey=FALSE;
else
m_bKey=TRUE;
InvalidateRect(m_rectRec);
CView::OnLButtonDown(nFlags, point);
}
(4)在視圖類的OnDraw函數中添加相應代碼:
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(m_bKey)
pDC->Ellipse(m_rectRec);
else
pDC->Rectangle(m_rectRec);
}
答:已做
3、編寫一個單文檔應用程序,程序啟動後在用戶區顯示一個橢圓形,每單擊鼠標左鍵一次則圓的顏色會變化一次。
答:(1)在視圖類聲明定義成員變量
private:
int m_clr1;
int m_clr2;
int m_clr3;
(2)在視圖類的構造函數中對成員變量進行初始化
CCIRCLEView::CCIRCLEView()
{
m_clr1=255;
m_clr2=255;
m_clr3=255;
}
(3)在視圖類鼠標左鍵按下消息中添加相應代碼:
void CCIRCLEView::OnLButtonDown(UINT nFlags, CPoint point)
{
if(m_clr1>10)
{
m_clr1-=10;
m_clr2-=10;
m_clr3-=10;
}
else
{
m_clr1=255;
m_clr1=255;
m_clr1=255;
}
InvalidateRect(NULL);
CView::OnLButtonDown(nFlags, point);
}
(4)在視圖類的OnDraw函數中添加相應代碼:
void CCIRCLEView::OnDraw(CDC* pDC)
{
CCIRCLEDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
COLORREF clr=RGB(m_clr1,m_clr2,m_clr3);
CBrush newBrush(clr);
CBrush *oldBrush=pDC->SelectObject(&newBrush);
pDC->Ellipse(20,20,200,200);
pDC->SelectObject(oldBrush);
}
答:已做
4、簡單的計算程序界面如下圖所示,操作數1對應編輯框控件的ID為 IDC_EDIT1,對應值類型的成員變量m_op1(int);操作數2對應編輯框控件的ID為IDC_EDIT2,對應值類型的成員變量m_op2(int);計算結果對應的編輯框控件的ID 為IDC_EDIT3,對應值類型的成員變量m_result(int)。 假設輸入的數為整數,加法按鈕的功能是將兩操作數相加,並將結果在對應的編輯框IDC_EDIT3顯示出來。寫出加法按鈕對應的代碼。
void CExDlg::OnButton1()
{
UpdateDate(TRUE); //此處是UpdateData(TRUE);
m_result = m_op1 + m_op2;
UpdateDate(FALSE);
}
void CExDlg::OnButton2()
{
UpdateDate(TRUE);
m_result = m_op1 - m_op2;
UpdateDate(FALSE);
}
答:已做
5、下面是一個基於對話框的應用程序,用來求解一元二次方程的根。當用戶在A、B、C 三個編輯框中輸入3個參數後,單擊【計算】按鈕,將顯示出該方程的根。
各控件對應的成員變量見下表:
控件ID號
變量類型
變量名
IDC_A_EDIT
int
m_a
IDC_B_EDIT
int
m_b
IDC_C_EDIT
int
m_c
IDC_X1_EDIT
CString
m_x1
IDC_X2_EDIT
Cstring
m_x2
試寫出計算按鈕的單擊消息處理函數。
答:void CEx6_1Dlg::OnButton1()
{
UpdateData();
double disc;
disc=(double)(m_b*m_b-4*m_a*m_c);
if ( fabs(disc)<=1e-6 ) //如果disc等於0
{ m_x1.Format("x1=%6.2f ",-m_b/(2*m_a));
m_x2.Format("x2=%6.2f ",-m_b/(2*m_a));
}
else if ( disc>1e-6 ) //如果disc大於0
{ double x1,x2;
x1=(-m_b-sqrt(disc))/(2*m_a);
x2=(-m_b+sqrt(disc))/(2*m_a);
m_x1.Format("x1=%6.2f",x1);
m_x2.Format("x2=%6.2f",x2);
}
else //如果disc小於0
{
double realpart,imagpart;
realpart=-m_b/(2*m_a);
imagpart=sqrt(-disc)/(2*m_a);
m_x1.Format("x1=%6.2f+%6.2fi",realpart,imagpart);
m_x2.Format("x2=%6.2f-%6.2fi",realpart,imagpart);
}
UpdateData(FALSE);
}
注意添加
6、編寫一個單文檔應用程序,該程序在用戶區能以在兩個矩形的相交矩形為外接矩形畫一個橢圓。(注意:只考慮兩個矩形相交的情況,不考慮不相交的情況。)
答:(1)在視圖類聲明定義成員變量
private:
CRect m_rRect1;
CRect m_rRect2;
(2)在視圖類的構造函數中對成員變量進行初始化
CRECTView::CRECTView()
{
m_rRect1.left=50;
m_rRect1.top=50;
m_rRect1.bottom=200;
m_rRect1.right=250;
m_rRect2.left=100;
m_rRect2.top=120;
m_rRect2.bottom=400;
m_rRect2.right=300;
}
(3)在視圖類的OnDraw函數中添加相應代碼:
void CRECTView::OnDraw(CDC* pDC)
{
CRECTDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int x1,y1,x2,y2;
if(m_rRect1.left
x1=m_rRect2.left;
else
x1=m_rRect1.left;
if(m_rRect1.top
y1=m_rRect2.top;
else
y1=m_rRect1.top;
if(m_rRect1.right
x2=m_rRect1.right;
else
x2=m_rRect2.right;
if(m_rRect1.bottom
y2=m_rRect1.bottom;
else
y2=m_rRect2.bottom;
pDC->Ellipse(x1,y1,x2,y2);
}
答:已做
7、編寫一個單文檔應用程序,在窗口用戶區中繪制一個矩形,用鍵盤上的上、下、左、右光標鍵可以使該矩形分別向4個方向移動,(注意:每一次只移動15像素,矩形不能移出屏幕)。
答:(1)在文檔類聲明定義成員變量
public:
CRect m_rect;
(2)在文檔類的構造函數中對成員變量進行初始化
CSample0803Doc::CSample0803Doc()
{
m_rect.left=50;
m_rect.right=150;
m_rect.top=50;
m_rect.bottom=150;
}
(3)在視圖類的OnDraw函數中添加相應代碼:
void CSample0803View::OnDraw(CDC* pDC)
{
CSample0803Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->Rectangle(pDoc->m_rect);
}
(4)在視圖類的OnKeyDown函數中添加相應代碼:
void CSample0803View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CSample0803Doc *pDoc=GetDocument();
CRect rt;
GetClientRect(&rt); //獲取當前的繪圖區域
switch(nChar)
{
case VK_LEFT: //如果按下的是向左的箭頭"←"
if(pDoc->m_rect.left>15)
{
pDoc->m_rect.left-=15;
pDoc->m_rect.right-=15;
}
break;
case VK_RIGHT: //如果按下的是向右的箭頭"→"
if(pDoc->m_rect.right<=(rt.right-rt.left)-15)
{
pDoc->m_rect.left+=15;
pDoc->m_rect.right+=15;
}
break;
case VK_UP: //如果按下的是向上的箭頭"↑"
if(pDoc->m_rect.top>15)
{
pDoc->m_rect.top-=15;
pDoc->m_rect.bottom-=15;
}
break;
case VK_DOWN: //如果按下的是向下的箭頭"↓"
if(pDoc->m_rect.bottom<=(rt.bottom-rt.top)-15)
{
pDoc->m_rect.top+=15;
pDoc->m_rect.bottom+=15;
}
break;
}
InvalidateRect(NULL,TRUE); //刷新窗口
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
答:已做
8、簡單計算程序界面如下圖所示,x對應編輯框控件的ID為 IDC_EDIT1,對應值類型的成員變量m_x(double);y對應編輯框控件的ID為IDC_EDIT2,對應值類型的成員變量m_y(double);z對應的編輯框控件的ID 為IDC_EDIT3,對應值類型的成員變量m_z(double)。乘法按鈕的功能是將x,y相乘,除法按鈕的功能是將x,y相除,並將結果在z對應的編輯框IDC_EDIT3顯示出來。寫出乘法按鈕和除法按鈕對應的代碼。
答:void CExDlg::OnButtonMul()
{ UpdateDate(TRUE);
m_z = m_x * m_y;
UpdateDate(FALSE);
}
void CExDlg::OnButtonDiv()
{ UpdateDate(TRUE);
if ( m_y == 0 )
{ MessageBox( “除數不能為0!”);
return;
}
m_z = m_x / m_y;
UpdateDate(FALSE);
}
答:已做
9、設計一個基於對話框的應用程序,如下圖所示。要求:單擊Color按鈕,能彈出通用顏色對話框選取顏色,並用該顏色在屏幕坐標(100,100)位置顯示:This is a color example。
寫出Color按鈕的BN_CLICKED消息處理函數。
答:void CDialog1Dlg::OnColor()
{
COLORREF m_clr;
CColorDialog dlg;
if(dlg.DoModal()==IDOK)
{
m_clr=dlg.GetColor();
CClientDC dc(this);
dc.SetTextColor(m_clr);
dc.TextOut(100,100,"This is a color example。");
}
}
答:已做
10、為學員信息設計一個類CStudent,包含:學號、姓名、出生日期、家庭住址、班級,並使該類可以實現串行化。請寫出可以實現要求的CStudent.h和CStudent.cpp文件的內容
//CStudent.h
class CStudent :public CObject {
public:
CString Num;
CString Name;
CTime Birth;
CString Address;
CString Grade;
DECLARE_SERIAL(CStudent) // 使對象可串行化
virtual void Serialize( CArchive & ar ); //重載串行化函數
};
// CStudent.cpp
IMPLEMENT_SERIAL(CStudent,CObject, 0)
void CStudent:Serialize(CArchive & ar)
{ CObject::Serialize(ar);
if ( ar.IsStoring() )
{ ar<
}
else
{ ar>>Num>>Name>> Birth >>Address>>Grade;
}
}
11、創建一個記錄通訊錄內容的新類Caddrlist,包含:姓名、住址、電話、出生日期,並使該類可以實現串行化。請寫出可以實現要求的CAddrlist.h和CAddrlist.cpp文件的內容
答:
//Addrlist.h文件內容:
class CAddrlist : public CObject {
public:
CString Name;
CString Address;
CString Tel;
CTime Birth;
CAddrlist();
DECLARE_SERIAL(CAddrlist) // 使對象可串行化
virtual void Serialize( CArchive & ar ); //重載串行化函數
};
// Addrlist.cpp文件內容:
IMPLEMENT_SERIAL(CAddrlist,CObject, 0)
void CAddrlist::Serialize(CArchive & ar)
{ CObject::Serialize(ar);
if ( ar.IsStoring() )
{ ar< } else { ar>>Name>>Tel>>Address>>Birth; } } 12、編寫一個單文檔應用程序,在窗口用戶區中繪制一個圓形,當單擊鼠標左鍵時,圓形變大為原圖形2倍大,當單擊鼠標右鍵時,圓形恢復原狀。(注意:矩形的左上角坐標不變) 答:(1)在文檔類聲明定義成員變量 public: CRect m_rect; (2)在文檔類的構造函數中對成員變量進行初始化 CSample0804Doc::CSample0804Doc() { m_rect.left=100; m_rect.right=150; m_rect.top=100; m_rect.bottom=150; } (3)在視圖類的OnDraw函數中添加相應代碼: void CSample0804View::OnDraw(CDC* pDC) { CSample0804Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDC->Ellipse(pDoc->m_rect); } (4)在視圖類的OnLButtonDown函數中添加相應代碼: void CSample0804View::OnLButtonDown(UINT nFlags, CPoint point) { CSample0804Doc* pDoc=GetDocument(); CRect rt; GetClientRect(&rt); //獲取當前的繪圖區域 pDoc->m_rect.left=100; pDoc->m_rect.right=200; pDoc->m_rect.top=100; pDoc->m_rect.bottom=200; InvalidateRect(NULL,TRUE); //刷新窗口 CView::OnLButtonDown(nFlags, point); } (5)在視圖類的OnRButtonDown函數中添加相應代碼: void CSample0804View::OnRButtonDown(UINT nFlags, CPoint point) { CSample0804Doc* pDoc=GetDocument(); CRect rt; GetClientRect(&rt); //獲取當前的繪圖區域 pDoc->m_rect.left=100; pDoc->m_rect.right=150; pDoc->m_rect.top=100; pDoc->m_rect.bottom=150; InvalidateRect(NULL,TRUE); //刷新窗口 CView::OnRButtonDown(nFlags, point); } 答:已做 三、給下面的程序中每一句加注釋 #include #include LRESULT CALLBACK WinSunProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ); int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // command line int nCmdShow // show state ) { WNDCLASS wndcls; wndcls.cbClsExtra=0; wndcls.cbWndExtra=0; wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); wndcls.hIcon=LoadIcon(NULL,IDI_ERROR); wndcls.hInstance=hInstance; wndcls.lpfnWndProc=WinSunProc; wndcls.lpszClassName="Weixin2003"; wndcls.lpszMenuName=NULL; wndcls.style=CS_HREDRAW | CS_VREDRAW; RegisterClass(&wndcls); HWND hwnd; hwnd=CreateWindow("Weixin2003","北京維新科學技術培訓中心",WS_OVERLAPPEDWINDOW, 0,0,600,400,NULL,NULL,hInstance,NULL); ShowWindow(hwnd,SW_SHOWNORMAL); UpdateWindow(hwnd); MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WinSunProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { switch(uMsg) { case WM_CHAR: char szChar[20]; sprintf(szChar,"char is %d",wParam); MessageBox(hwnd,szChar,"weixin",0); break; case WM_LBUTTONDOWN: MessageBox(hwnd,"mouse clicked","weixin",0); HDC hdc; hdc=GetDC(hwnd); TextOut(hdc,0,50,"計算機編程語言培訓",strlen("計算機編程語言培訓")); ReleaseDC(hwnd,hdc); break; case WM_PAINT: HDC hDC; PAINTSTRUCT ps; hDC=BeginPaint(hwnd,&ps); TextOut(hDC,0,0,"維新培訓",strlen("維新培訓")); EndPaint(hwnd,&ps); break; case WM_CLOSE: if(IDYES==MessageBox(hwnd,"是否真的結束?","weixin",MB_YESNO)) { DestroyWindow(hwnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam); } return 0; } 2、 #include #include LRESULT CALLBACK WinSunProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ); int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // command line int nCmdShow // show state ) { WNDCLASS wndcls; wndcls.cbClsExtra=0; wndcls.cbWndExtra=0; wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); wndcls.hIcon=LoadIcon(NULL,IDI_ERROR); wndcls.hInstance=hInstance; wndcls.lpfnWndProc=WinSunProc; wndcls.lpszClassName="Computer2009"; wndcls.lpszMenuName=NULL; wndcls.style=CS_HREDRAW | CS_VREDRAW; RegisterClass(&wndcls); HWND hwnd; hwnd=CreateWindow("Computer2009","桂林電子科技大學應用科技學院",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL); ShowWindow(hwnd,SW_SHOWNORMAL); UpdateWindow(hwnd); MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WinSunProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { switch(uMsg) { case WM_CHAR: char szChar[20]; sprintf(szChar,"char is %d",wParam); MessageBox(hwnd,szChar,"weixin",0); break; case WM_LBUTTONDOWN: MessageBox(hwnd,"mouse clicked","weixin",0); HDC hdc; hdc=GetDC(hwnd); TextOut(hdc,0,50,"Widows程序設計實驗",strlen("Widows程序設計實驗")); ReleaseDC(hwnd,hdc); break; case WM_PAINT: HDC hDC; PAINTSTRUCT ps; hDC=BeginPaint(hwnd,&ps); TextOut(hDC,0,0," 程序設計實驗",strlen("程序設計實驗")); EndPaint(hwnd,&ps); break; case WM_CLOSE: if(IDYES==MessageBox(hwnd,"是否真的結束?","Compuer",MB_YESNO)) { DestroyWindow(hwnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam); } return 0; } } 3、 #include #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("HelloWin") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, // window class name TEXT ("The Hello Program"), // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position CW_USEDEFAULT, // initial x size CW_USEDEFAULT, // initial y size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL) ; // creation parameters ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } int g_iClickNum; LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc ; PAINTSTRUCT ps ; RECT rect ; switch (message) { case WM_CREATE: g_iClickNum = 0; return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; FillRect(hdc, &rect, CreateSolidBrush(GetBkColor(hdc))); //用當前背景色填充客戶區 if(g_iClickNum==0) { SetTextColor(hdc, RGB(255,0,0)); DrawText (hdc, TEXT ("歡迎使用"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; } else { char c[100]; sprintf(c, "第%d次鼠標左鍵按下", g_iClickNum); SetTextColor(hdc, RGB(0,0,255)); DrawText (hdc, c, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; } EndPaint (hwnd, &ps) ; return 0 ; case WM_LBUTTONDOWN: g_iClickNum++; RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE); return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }