MFC、VC++综合作业题

一、简答题

1、在文档/视图结构的应用程序中,视图类对象是如何获取文档类对象中数据的

答:通过GetDocument()函数

 

2、假设建立一个工程名为MyPrj的工程,利用MFC AppWizard生成文档/视图结构应用程

序框架的4MFC派生类,简述这四个类名和它们的功能。
答:

(1)CMyPrjApp应用程序类:应用程序的起点,负责应用程序的启动。

(2)CMyPrjFrame框架窗口类:应用程序的框架窗口。

(3)CMyPrjView视图类:专门用来堆应用程序的数据进行显示。

(4)CMyPrjDoc文档类:保存程序中的数据成员,对程序中的数据进行管理。

3、在Windows程序设计中,如何显示和更新窗口?
答:调用windows系统函数ShowWindow( )显示窗口,UpdateWindow( )更新窗口。

4、试说明以下是什么句柄?

1HWND窗口句柄

2HINSTANCE当前应用程序实例句柄

3HDC设备上下文句柄

5Windows应用程序的主要函数有哪3个主要任务?
答:注册窗口类创建应用程序的窗口建立消息循环。 

6、在窗口类CFrameWnd中需要封装哪些成员?
答:在窗体类CFrameWnd中需要封装窗口句柄hWnd窗口类型属性的定义窗口类型的注册窗口的创建和显示更新窗口

7、应用程序类CWinApp应该具备哪些主要功能?
答:在CWinApp中主要有两个功能,一是调用成员函数InitInstance()来完成窗口的设计、注册、创建和显示工作;二是调用成员函数Run()来实现消息循环。

 

8、在MFCCDC的派生类有哪几个?试说出它们的作用?
答: (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)显示位图。

19GetMessage()函数在什么情况下返回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块中说明消息处理函数。

第三步:实现消息处理函数。该函数使用WPRAMLPARAM参数并返回LPESULT

第四步:在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。


22、简述模态对话框与非模态对话框的区别?
答:
(1). 模式对话框就是不处理它就没法处理父窗口,而非模式对话框就是不用先处理此对话框也可以处理父窗口.

(2). 模式对话框一般是使用DoModal,而非模式对话框的创建则是使用Create
(3). 模式对话框的销毁是使用EndDialog,而非模式对话框的销毁是使用DestroyWindow

二、编写程序(编程题已经打包上传, 点击下载)

1、编写一个应用程序,使用CDC类的TextOut函数在屏幕坐标(100100)的位置输出“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);       

}
注意添加<math.h>头文件

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<m_rRect2.left)

x1=m_rRect2.left;

else

x1=m_rRect1.left;

if(m_rRect1.top<m_rRect2.top)

y1=m_rRect2.top;

else

y1=m_rRect1.top;

if(m_rRect1.right<m_rRect2.right)

x2=m_rRect1.right;

else

x2=m_rRect2.right;

if(m_rRect1.bottom<m_rRect2.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<<Num<<Name<< Birth <<Address<<Grade;

}

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<<Name<<Tel<<Address<<Birth;

}

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 <windows.h>

#include <stdio.h>

 

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 <windows.h>

#include <stdio.h>

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 <windows.h>

#include <stdio.h>  //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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值