一、简答题
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);
}
注意添加<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) ;
}
注:编程题下载,点击下载