程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> MFC、VC++綜合作業題

MFC、VC++綜合作業題

編輯:關於C++

一、簡答題

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 //sprintf()函數在這個頭文件中聲明

 

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) ;

}

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved