mfc编程 孙鑫_以前的一些mfc的笔记(关于孙鑫的那本书)
日记2010-4-5
关于MFC中的文本的编程:
简单是:
1,在CTestView中定义两个变量一个为CPoint的m_ptOrigin并设置为0;和
CString的m_strLine的并设置为“”,在CTextView中。Cpp设置。
2,在CTestView中建立windows WM_CREAT中创建OnCreate
中编辑//CClientDC dc(this);
//TEXTMETRIC tm;
//dc.GetTextMetrics(&tm);
//CreateSolidCaret(20,100);
//CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
//ShowCaret();
//CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CreateCaret(&bitmap);//注意变量
ShowCaret();
3,在OnDraw中编辑
CTextDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CString str("我爱你,你爱我吗?");
pDC->TextOut(50,50,str);
CSize sz=pDC->GetTextExtent(str);
str.LoadString(IDS_STRING61446);
pDC->TextOut(0,200,str);
pDC->BeginPath();
pDC->Rectangle(50,50,50+sz.cx,50+sz.cy);
pDC->EndPath();
pDC->SelectClipPath(RGN_AND);
for(int i=0;i<300;i+=10)
{
pDC->MoveTo(0,i);
pDC->LineTo(300,i);
pDC->MoveTo(i,0);
pDC->LineTo(i,300);
}
4,
在OnLButton中
SetCaretPos(point);
m_strLine.Empty();
m_ptOrigin=point;
5,在OnChar中:
CClientDC dc(this);
m_strLine+=nChar;
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
参见书中的152页。
注意几个函数:
1.dc.GetTextExtent可以得到字符串宽度、
如CSize sz=dc.GetTextExtent(m_strLine);
2.GetTextMetrics是为了获得当前字体的度量信息
3.捉迷藏:#include
4.void main()
5.{
6.
7.int a[10]={11,11,11,11,11,11,11,11,11,11};
8.int i=0;
9.for(int j=0;j<1000;j++)
10.{
11.i=(i+j+1)%10;
12.a[i]=i;
13.}
14.for(int k=0;k<10;k++)
15.{
16.
17.if(a[k]==11)
18.printf("%d\n",k);
19.}
20.
21.}
22.另一种做法:链表法:
23.#include
24.using namespace std;
25.
26.typedef struct node
27.{
28.int data;
29.node *next;
30.}node;
31.
32.node *node_create(int n);
33.node *node_create(int n)
34.{
35.node *pRet=NULL;
36.if(0!=n)
37.{
38.int n_idx=1;
39.node *p_node=NULL;
40.
41.p_node= new node[n];
42./*if(NULL==p_node)
43.{
44.return NULL;
45.}
46.else
47.{
48.memset(p_node,0,n*sizeof(node));
49.
50.}*/
51.pRet=p_node;
52.while(n_idx
53.{
54.p_node->data=n_idx;
55.p_node->next=p_node+1;
56.p_node=p_node->next;
57.n_idx++;
58.}
59.
60.p_node->data=n;
61.p_node->next=pRet;
62.
63.}
64.return pRet;
65.}
66.
67.int main()
68.{
69.node *pList=NULL;
70.node *pIter=NULL;
71.int n=10;
72.//int m=6;
73.
74.pList=node_create(n);
75.
76.pIter=pList;
77.//m%=n;
78.//while(pIter!=pIter->next)
79.// {
80.int a[10]={0};
81.a[(pIter->data)-1]=pIter->data;
82.for(int j=2;j<1000;j++)
83.{
84.for(int i=1;i<=j;i++)
85.{
86.pIter=pIter->next;
87.}
88.printf("%d",pIter->data);
89.printf(" ");
90.a[(pIter->data)-1]=pIter->data;
91.
92.
93.
94.//printf("%d\n",pIter->next->data);
95.// pIter->next=pIter->next->next;
96.// pIter=pIter->next;
97.}
98.printf("他隐藏的洞为:");
99.for(int k=0;k<10;k++)
100.{
101.if(a[k]==0)
102.printf("%d",k+1);
103.}
104.
105.
106.
107.// }
108.//printf("%d\n",pIter->data);
109.delete[] pList;
110.return 0;
111.}
112.
113.
114.
115.
116.
117.
关于文本编辑时的光标的移动:
CSize sz = dc.GetTextExtent(m_strLine);
CPoint pt;
pt.x=m_ptOrigin.x+sz.cx;
pt.y=m_ptOrigin.y;
SetCaretPos(pt);
关于字体的的设置:
CFont font;
font.CreatePointFont(300,"华文行楷",NULL);
CFont *pOldFont = dc.SelectObject(&font);
。。。。。。。。。。。。。
dc.SelectObject(pOldFont);
文件操作函数:
Fopen
Fseek
Ftell
Fread
Fclose
Rewind
Fflush
文件的操作
关于文件的打开和写入:FILE *pFile=fopen("1.txt","w");
Fwrite("http://www.sunxin.org",1,strlen("http://www.sunxin.org"),pFile);
关于文件的写入:
加入:*****
Fclose(pFile);
Fflush(pFile):
1,fseek函数可以吧文件指针从当前位置移动到指定的位置
*****************
Feek(pFile,0,SEEK_SET);
Fwrite(“ftp:”,1,strlen("ftp:"),pFile);
Fclose(pfile);
2.文件的读取有三种方法:第一种:
FILE *pFile=fopen("1.txt","r");
Char ch[100];
Fread(ch,1,100,pFile);
Fclose(pFile);
MessageBox(ch);
错误的
应该修改为:
第一种:
FLFE *pFile=fopen("1.txt","w"):
Char buf[20]="http://ww.sunxin.org":
Buf[21]='\0';
Fwrite(but,1,22,pFile);
Fclose(pFile);
第二种为:
FILE *pFile-fopen("1.txt","r");
Char ch[100];
Memset(ch,0,100);
Fread(ch,1,100,pFile);
Fclose(pFile_;
MessageBox(ch);
第三种:
FILE *pFile=fopen("1.txt","r");
Char *pBuf;
Fseek(pFile,0,SEEK_END);将文件指针移到文件末尾
Int len=ftell(pFile); *****ftell函数是为了获得文件的长度
pBuf=new char[len+1];
Fread(pBuf,1.len,pFile);
pBuf[len]=0;
Fclose(pFile);
messageBox(pBuf);
注意:**********
二进制文件和文本文件,二进制文件的读取时增加了一个rb,wb,
一个面试题:
FILE *pFile=fopen("3,txt,","w");
Int i=98341;
Char ch[5];
Itoa(i,ch,10);
Fwrite(ch,1,5,pFile);
Fclose(pFile);
或者这样做:
FILE *pFile=fopen("2,txt","w");
Char ch[5];
Ch[0]=9+48:
Ch[1]=8+48:
Ch[2]=3+48:
Ch[3]=4+48:
Ch[4]=1+48:
************
C++关于文件的操作时用的ofstream,ifstream
**********注意一点是必须增加头文件:#include
**********
Win32 API关于文件的操作:
文件的创建或打开用的CreatFile
文件的写入时:WrieFile
文件按的读取:ReadFile
例如:
Void CFIleView::OnFileWrite()
{
定义一个句柄变量
HANDLE hFile;
创建文件:
hFile=CreateFile(***********
接收实际写入的字节数:
DWORD dwWrite;
写入数据
WriteFile(*********
关闭句柄
CloseHandle(hFile );
}
参照vc++深入编程458页
关于MPC对文件的操作:
日记2010-4-6
int a; //是声明也是定义!
extern int a; //声明!
//int可以省略!
extern int a = 1; //出错
*********
char ch;
ch = “A ”;地址
char ch;
ch = ‘A’;
#include
int fun(int a)
{
if(a>0)
{ printf("a>0\n");return 1;}
if(0==a)
{ printf("a=0\n");return 0; }
if(a<0)
{ printf("a<0\n");return -1; }
}
思考:存在问题
思考下面这个函数设计有什么问题
warning C4715: 'fun' : not all control paths return a valu
必须添加return 0;
文件使用方式意 义
“rt” 只读打开一个文本文件,只允许读数据
“wt” 只写打开或建立一个文本文件,只允许写数据
“at” 追加打开一个文本文件,并在文件末尾写数据
“rb” 只读打开一个二进制文件,只允许读数据
“wb” 只写打开或建立一个二进制文件,只允许写数据
“ab” 追加打开一个二进制文件,并在文件末尾写数据
“rt+” 读写打开一个文本文件,允许读和写
“wt+” 读写打开或建立一个文本文件,允许读写
“at+” 读写打开一个文本文件,允许读,或在文件末追加数 据
“rb+” 读写打开一个二进制文件,允许读和写
“wb+” 读写打开或建立一个二进制文件,允许读和写
“ab+” 读写打开一个二进制文件,允许读,或在文件末追加数据
对于文件使用方式有以下几点说明:
1.文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:
r(read):读
w(write):写
a(append):追加
t(text):文本文件,可省略不写
b(banary):二进制文件
+:读和写
2.凡用“r”打开一个文件时,该文件必须已经存在, 且只能从该文件读出。
Getch()是为了获得一个字符,但是不显示
Getchar() 是为了获得一个字符 ,ch=getchar();
Getche()是为了获得一个字符ASCII
[例10.1]读入文件e10-1.c,在屏幕上输出。
#include
main()
{
FILE *fp;
char ch;
if((fp=fopen("e10_1.c","rt"))==NULL)
{
printf("Cannot open file strike any key exit!");
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
getch();
exit(1);
}
ch=fgetc(fp);//是从文件中读取一个字符;
while (ch!=EOF) EOF表示是-1;
{
putchar(ch);//输出字符串
ch=fgetc(fp);
}
fclose(fp);
}
关于结构体:#include"stdio.h"
#define NUM 3
struct mem
{
char name[20];
char phone[10];
};
void main()
{
struct mem man[NUM];
int i;
for(i=0;i
{
printf("input name:\n");
gets(man[i].name);
printf("input phone:\n");
gets(man[i].phone);
}
printf("name\t\t\tphone\n\n");
for(i=0;i
printf("%s\t\t\t%s\n",man[i].name,man[i].phone);}
[例7.7]用指针变量输出结构数组。
struct stu
{
int num;
char *name;
char sex;
float score;
}boy[5]={
{101,"Zhou ping",'M',45},
{102,"Zhang ping",'M',62.5},
{103,"Liou fang",'F',92.5},
{104,"Cheng ling",'F',87},
{105,"Wang ming",'M',58},
};
main()
{
struct stu *ps;
printf("No\tName\t\t\tSex\tScore\t\n");
for(ps=boy;ps
printf("%d\t%s\t\t%c\t%f\t\n",ps->num,ps->name,ps->sex,ps->
score);
}
“联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间,一个结构变量的总长度是
各成员长度之和。而在“联合”中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。应该说明的是, 这
里所谓的共享不是指把多个成员同时装入一个联合变量内,而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入
新值则冲去旧值。如前面介绍的“单位”变量, 如定义为一个可装入“班级”或“教研室”的联合后,就允许赋予整型值(班级)
或字符串(教研室)。要么赋予整型值,要么赋予字符串,不能把两者同时赋予它。联合类型的定义和联合变量的说明一个联合类型
必须经过定义之后, 才能把变量说明为该联合类型
2010 4 8日记:
#include
WINDOWS.H是主要的含入文件,它包含了其它Windows表头文件,这些表头文件的某些也包含了其它表头文件。这些表头文件中最重要的和最基本的是:
WINDEF.H基本型态定义。
WINNT.H支持Unicode的型态定义。
WINBASE.H Kernel函数。
WINUSER.H使用者接口函数。
WINGDI.H图形设备接口函数。
#include
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
MessageBox (NULL, TEXT ("Hello, Windows 98!"), TEXT ("HelloMsg"), 0);
return 0 ;
}
int
WINAPI
WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd
);
WinMain的第一个参数被称作「执行实体句柄」。在Windows程序设计中,句柄仅是一个应用程序用来识别某些东西的数字。在这种情况下,该句柄唯一地标识该程序,还需要它在其它Windows函数呼叫中作为参数。在Windows的早期版本中,当同时运行同一程序多次时,您便创建了该程序的「多个执行实体(multiple instances)」。同一应用程序的所有执行实体共享程序和只读的内存(通常是例如菜单和对话框模板的资源)。程序通过检查hPrevInstance参数就能够确定自身的其它执行实体是否正在运行。然后它可以略过一些繁杂的工作并从前面的执行实体将某些数据移到自己的数据区域。
在32位Windows版本中,该概念已被抛弃。传给WinMain的第二个参数总是NULL(定义为0)。
WinMain的第三个参数是用于执行程序的命令列。某些Windows应用程序利用它在程序启动时将文件加载内存。WinMain的第四个参数指出程序最初显示的方式,可以是正常的或者是最大化地充满整个画面,或者是最小化显示在工作列中。我们将在第三章中介绍使用该参数的方法。
MessageBox函数用于显示短信息。虽然,MessageBox显示的小窗口不具有什么功能,实际上它被认为是一个对话框。
MessageBox的第一个参数通常是窗口句柄,我们将在第三章介绍其含义。第二个参数是在消息框主体中显示的字符串,第三个参数是出现在消息框标题列上的字符串。在HELLMSG.C中,这些文字字符串的每一个都被封装在一个TEXT宏中。通常您不必将所有字符串都封装在TEXT宏中,但如果想将您的程序转换为Unicode字符集,这确是一个好主意。我将在第二章详细讨论该问题。
MessageBox的第四个参数可以是在WINUSER.H中定义的一组以前缀MB_开始的常数的组合。您可从第一组中选择一个常数指出希望在对话框中显示的按钮:
#define MB_OK 0x00000000L
#define MB_OKCANCEL x00000001L
#define MB_ABORTRETRYIGNORE 0x00000002L
#define MB_YESNOCANCEL 0x00000003L
正常情况下,在编译阶段,编译器从C原始码文件产生一个.OBJ(目标)文件。在连结阶段,连结程序结合.OBJ文件和.LIB(库)文件以建立.EXE(可执行)文件。通过在「Project」页面标签上选择「Settings」并单击「Link」页面标签可以查看这些库文件的列表。特别地,您会注意到KERNEL32.LIB、USER32.LIB和GDI32.LIB。这些是三个主要Windows子系统的「引用链接库」。它们包含了动态链接库的名称以及放进.EXE文件的引用信息。Windows使用该信息处理程序对KERNEL32.DLL、USER32.DLL、GDI32.DLL动态链接库中函数的呼叫。
2010 4 9
这个问题用几个解决方案。我首选的方案是:
while(1)
{
?}
5.用变量a给出下面的定义
a)一个整型数(An integer)
b)一个指向整型数的指针(A pointer to an integer)
c)一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an intege)r
d)一个有10个整型数的数组(An array of 10 integers)
e)一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to integers)
f)一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)
g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument
and returns an integer)
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(An array of ten pointers to functions t
hat take an integer argument and return an integer)
答案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer
人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。当我写这篇文章时,为了确定语法的正确性,我的
Static
6.关键字static的作用是什么?
这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:
?;在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
?;在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变
量。
?;在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然
不懂得本地化数据和代码范围的好处和重要性。
#define BIT3 (0x1 << 3)
static int a;
void set_bit3(void) {
a |= BIT3;
}
void clear_bit3(void) {
a &= ~BIT3;
}
unsigned int compzero = ~0;
char * strcpy( char *strDest, const char *strSrc )
{
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘\0’ );
return address;
}
4,21日,
创建画刷,和画笔HBRUSH hBrush = GetStockObject(REG(255,0,0);
呼叫selectObject将它选进设备内容:
SelectObject (hdc, hBrush) ;
您也可以不定义hPen变量,而将GetStockObject和SelectObject呼叫合并成一个叙述:
SelectObject (hdc, GetStockObject (WHITE_PEN)) ;
如果想恢复到使用BLACK_PEN的状态,可以用一个叙述取得这种画笔的句柄,并将其选进设备内容:
SelectObject (hdc, GetStockObject (BLACK_PEN)) ;
Windows程序以句柄来使用画笔。Windows表头文件WINDEF.H中包含一个叫做HPEN的型态定义,即画笔的句柄,可以定义这个型态的变量(例如hPen):
HPEN hPen ;
呼叫GetStockObject,可以获得现有画笔的句柄。例如,假设您想使用名为WHITE_PEN的现有画笔,可以如下取得画笔的句柄:
hPen = GetStockObject (WHITE_PEN) ;
现在必须将画笔选进设备内容:
SelectObject (hdc, hPen) ;
case WM_CREARE:
SETIMER(null,1,6000,NULL)
Case WM_LBUTTON:
要得到窗口显示区域的设备内容句柄,可以呼叫GetDC来取得句柄,在使用完后呼叫 ReleaseDC:
hdc = GetDC (hwnd) ;
使用GDI函数
ReleaseDC (hwnd, hdc) ;
呼叫selectObject将它选进设备内容:
SelectObject (hdc, hBrush) ;
化线的几个函数:
MoveToEx (hdc, xBeg, yBeg, NULL) ;
LineTo (hdc, xEnd, yEnd) ;
Case WM_PAIN:
MoveToEx (hdc, 0, cyClient / 2, NULL) ;
LineTo (hdc, cxClient, cyClient / 2) ;
for (i = 0 ; i < NUM ; i++)
{
apt[i].x = i * cxClient / NUM ;
apt[i].y = (int) (cyClient / 2 * (1 - sin (TWOPI * i / NUM))) ;
}
Polyline (hdc, apt, NUM) ;
画圆:
Ellipse
Ellipse (hdc, xLeft, yTop, xRight, yBottom) ;
当您要将数组中的点连接成线时,使用Polyline函数要简单得多。下面这条叙述画出与上面一段程序代码相同的矩形:
Polyline (hdc, apt, 5) ;
画矩形:
Rectangle (hdc, 1, 1, 5, 4) ;
如果您需要在整个程序执行期间都使用定时器,那么您将得从WinMain函数中或者在处理WM_CREATE消息时呼叫SetTimer,并在退出WinMain或响应WM_DESTROY消息时呼叫KillTimer。根据呼叫SetTimer时使用的参数,可以下列三种方法之一使用定时器。
方法一
这是最方便的一种方法,它让Windows把WM_TIMER消息发送到应用程序的正常窗口消息处理程序中,SetTimer呼叫如下所示:
SetTimer (hwnd, 1, uiMsecInterval, NULL) ;
第一个参数是其窗口消息处理程序将接收WM_TIMER消息的窗口句柄。第二个参数是定时器ID,它是一个非0数值,在整个例子中假定为1。第三个参数是一个32位无正负号整数,以毫秒为单位指定一个时间间隔,一个60,000的值将使Windows每分钟发送一次WM_TIMER消息。
您可以通过呼叫
KillTimer (hwnd, 1) ;
在任何时刻停止WM_TIMER消息(即使正在处理WM_TIMER消息)。此函数的第二个参数是SetTimer呼叫中所用的同一个定时器ID。在终止程序之前,您应该响应WM_DESTROY消息停止任何活动的定时器。
当您的窗口消息处理程序收到一个WM_TIMER消息时,wParam参数等于定时器的ID值(上述情形为1),lParam参数为0。如果需要设定多个定时器,那么对每个定时器都使用不同的定时器ID。wParam的值将随传递到窗口消息处理程序的WM_TIMER消息的不同而不同。为了使程序更具有可读性,您可以使用#define叙述定义不同的定时器ID:
WM_LBUTTONDOWN
里面就有 坐标的x y的值 直接取出来
定义:RECT
POINT:
4.21晴
今天主要讲了一下mfc的机制,和 简单的画图:
1.切记 加上头文件:#include
2.要明白mfc中的继承关系
3.Cobject--ccmdtarget--cthread---cwinApp----CHellowinapp
4.Cobject---ccmdtaget--cwnd --cframewnd---
Win32 api即windows编程中关于
1.设计一个窗口类winmain中WNDCLASS wndcls;
2.注册一个窗口类RgeisterClass
3.创建一个窗口类HWND hwnd
Hwnd = createwindow(")
4.显示 和 刷新窗口,ShowWindow(hwnd,SW_SHOWNORMAL)
Updatewindow(hwnd)
5.定义消息结构体,开始消息循环:MSG msg
6.While(getMessage(&msg,NULL,0,0)
{
TranslateMessage(&msg);
DispatechMessage(&msg):
}
7.编写窗口过程函数:LRESULT CALLBACK WinSunProc
几个输出语句:sprintf:case WM_CHAR:
Char szChar[20];
Sprintf(szChar,"char code is %d",wparam);
Messagebox(hwend, szChar,"char",0);
Case WM_LBUTTON:
MessageBox(hwnd“Mouse clicked", "message ",0);
HDC hdc;
Hdc = GetDC(hwnd);
TextOut(hdc, 0, 50, "我爱你", strelen("我爱你")):
ReleaseDC(hwnd, hdc);
Case WM_PAINT:
HDC hDC;
Paintstruct ps;
hDC=BeginPaint(hwnd , &ps)
TextOut(hdc,0,0," kkk" ,strlen("kkk"));
EndPaint(hwnd,&ps);
今天还了一个画圆的例子,大概思路是
建两个类 一个是CHellownd继承的事CwinApp
还有一个是CMainFrame继承的事CFrame
注意在CMainFrame中IninInstrance中的大小写
还有事在 设置里面加入MFC静态 访问
注意:在CHellownd中
定义了virtual一个BOOL IninInstrance()
Return true;
还有事在CHellownd的构造还是
m_pMainWnd = new CMainFrame;
m_pMainWnd是在CThread中定义的事一个Cwnd类型的指针,他保存了了应用程序框架窗口对象的指针,也就是说,是指向CMainFrame对象的指针
m_pMainWnd->ShowWindow(SW_SHOW);
m_PMainWnd->UpdageWindow();
在CMainFrame中
ONPaint()函数 用于绘制 窗口
还用到一个ONLBUTTONDOWN(UINT flag,POINT point)
其中POINT指的是 当前坐标的位置;
主要代码:
一种方法是:
在ONLBUTTONDOWN中定义 一个画笔一个化刷,创建一个矩形,调用一个ellipse函数:
CRect rect;
Int r = rand()%60 +1;
CClientDcdc(this);
dc.Rect(point.X-r, point.Y-r, point.X+r, point.Y+r);
调用系统的化刷:
HBRUSH hBrush = GetStockObject(WHITE_BRUSH);
HPEN hPen = GetStockObject(NULL_HPEN):
创建一个自己的化刷和画笔:HBRUSH hBrush = CreateStockObject(RGB(255,0,0)):
HPen hPen = Createpen(CP_SOLID, 1, RGB(0, 0 , 255));
把画笔和化刷绑定到Hdc
SelectObject(hDC, hBrush);
selectObject(hDC,hPen);
花园:
Ellipse(hDC,point.X-r, point.Y-r, point.X+r, point.Y+r);
还有一种是
dc.Ellipse(rect);
第一种是在ONPAINT中实现的;
在ONLBUTTONDOWN主要是为了获得一个数组, 在窗口重绘的时候可以保留
在CMainFrame中定义一个数组和一个count;
#define MAX 100
RECT ARRAY【100】;
Int count;
在ONLBUTTONDOWN中主要操作时:
Static int i=0;
CRect rect;
Int r = rand()%60 +1;
CClientDcdc(this);
dc.Rect(point.X-r, point.Y-r, point.X+r, point.Y+r);
ARRAY[i++] = rect;
Count = i;
还有一一个主意
INvalidateRect(rect,1);
是为了触发onpaint
在那个onpaint的函数里面主要是:
CPaintDC dc(this);
For(int j= 0; j< = count:j++)
{
为了获得一个各种颜色的化刷,可以定义三个随机的变量:int x = rand()%255;
Int y = rand()% 255;
Int z -rand()%255;
HBRUSH hBrush = CreateStockObject(RGB(x,y,z)):
调用系统的化刷:
HBRUSH hBrush = GetStockObject(WHITE_BRUSH);
HPEN hPen = GetStockObject(NULL_HPEN):
创建一个自己的化刷和画笔:HBRUSH hBrush = CreateStockObject(RGB(255,0,0)):
HPen hPen = Createpen(CP_SOLID, 1, RGB(0, 0 , 255));
把画笔和化刷绑定到Hdc
SelectObject(hDC, hBrush);
selectObject(hDC,hPen);
花园:
Ellipse(hDC,point.X-r, point.Y-r, point.X+r, point.Y+r);这种不可以
还有一种是
dc.Ellipse(rect);
dc.Ellipse(ARRAY[i]);
}
4.24晴
对话框:
模态对话框:modal
非模态对话框:modeless
Cobject -ccmdtarget-cmd--cdialog
Cproperty and cpropertyPage是常见属性页,和向导对话框:
今天做的第一个例子m_length * m_wight = m_area
主意几点:
1。在创建一个对话框之后 用classwizard创建一个new class
并添加相应的m_length类型是int初始化是在构造函数里面一般是m_length =0
添加的事m_name类型是CString的 初始化一般是m_name = _T("");
添加相信的m_length类型是Cedit,Cbutton或者其他的控件,
注意:是在IninInstrance中初始化的m_length.setWindowText(" 1 ");
2.创建一个子对话框 创建相应的类CDialog1
3.在父类中 创建一个onbutton函数,(双击Button控件),
在里面
UpdateData();
CDialog dll;
M_area = m_ length * m_weighth;
如果是在子类的对话框中显示:在子类的中创建一个m_area1的变量
dll.M_area1 = m_area;
dll.DoModal ( );
UpdateData(FALSE);
红色的部分一定要加上 ,切记: 在密码,和个人信息匹配中也一定要加上:
类的更改步骤:
1,删除.C .Cpp
2.在文件所建的目录中招到.C .Cpp文件进行更改;
3, 在.Cpp .C中用replace替换所有
4,在头文件中应该改, 在用的地方也要改
创建一个非模态的对话框,可以显示好几个:
基本的步骤是:1,常见一个 子对话框 对应的创建一个新类:CDialog1
2,直接用:
CDialog1 dll;
dll.Create(IDD_IDTEST_DIALOG,
dll.ShowWindow(SW_SHOWNORMAL);
只会显示一段时间;
更改:
应该在父类 (父窗口)中创建一个子类CDiaTest *dll;
在IninInstrance中dll = NULL;
在OnButton中
If(dll == NULL)
{
Dll = new CDiaTest:
}
If(! (dll->GetSateHwnd())
{
dll-- >Create(IDD_ ****, this);
Dll- >ShowWindow(SW_ SHOWNOARMAL);
Else
{
Dll - > SHOWWIndow(SW_SHOWNORMAL)
}
并且在父类中增加一个wind消息响应函数:
WM_DESATROY
中CTEST::ONDESTORY()
{
If( dll ! = NULL)
Delete dll;
Dll = NULL;
}
属性页的基类:不是CDialog而是CPropertyPage
2,做一个有两个或三个属性页的对话框
先建一个主的对话框,在上面添加一个Onbutton对应的是:个人信息;
再建两个或三个属性页,如:个人爱好,个人信息,是在Cdialog中选择倒数第二个,并选择C P A,并建相应的类Chabby,和Cperson,
属性页的基类:不是CDialog而是CPropertyPage
然后再建一CpersonSheet继承CPropertySheet
查MSDN关于添加属性页的是:
AddPage(CPropertyPage * M)
1,定义两个属性页的对象:
Cperson m_person
Chabby m_hobby
2,在狗仔函数中的第二个添加, 也可以在两个里面都添加:
AddPage(&m_person)
AddPage(&m_hobby);
3,在OnButton中
CpersonSheet personinfo(“个人信息”);
Personinfo.DoModal();
3,做一个逃跑按钮:
注意函数:
ShowWindow(SW_HIDE);
在一个对话框上创建两个按钮,m_ButtonDown和m_ButtonUp
Shuxiang属性:CmouseMoveBtn并添加相应的图文件:
创建一个CMouseMoveBtn的类 这个类
中定一个
CMouseMoveBtn *m_pbtnAnother;
在IninInstrance中初始化
指针为NULL
在在对话框上CDIALAG中IninInstrance中
M_ButtonDown.m_pbtnAnother = & m_ButtonUp
m_ButtonUp. m_pbtnAnother = & M_ButtonDown
在CMouseMoveBtn的类 中选择WM_CMOUSEMOVE并产生相应的函数:
中添加:
This->ShowWindow(SW_HIDE)
M_pbtnAnoter->ShowWindow(SW_HIDE);
M_pbtnAnoter->ShowWindow(SW_HIDE);//好像是:SW_SHOW查一下书
创建一个个人信息,密码的进入的对话框
步骤:
1.创建一个对话框添加相应的组件,并在两个编辑框上创建相应两个变量
2.CString的类型m_name,m_mima;
3.在创建一个对话框并创建相应的类如CDialog1
4.在OnButton中
UpdateData();
CDialog1 dll;
Static int count = 3;
CString t("123456");
CSring s("guolong");
If(m_mima ! = t)
{
MessageBox("密码不正确“);
Count--;
}
If(count == 0)
{
EndDialog(IDOK);
或者CDialog::OnOK()
}
If(m_name == s&& m_mima == t)
{
dll.DoModal();
}
UpdateData(FALSE);}
总结
以上是生活随笔为你收集整理的mfc编程 孙鑫_以前的一些mfc的笔记(关于孙鑫的那本书)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: InDesign 教程:了解基本文本格式
- 下一篇: 利用FDTD软件仿真拓扑光子(六)-单向