glxhyt

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  15 随笔 :: 0 文章 :: 4 评论 :: 0 Trackbacks
 

          日记 2010-4-5

关于MFC中的文本的编程:

简单是:

1,在CTestView中定义两个变量一个为CPointm_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<stdio.h>

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<iostream>

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

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

 

注意:**********

二进制文件和文本文件,二进制文件的读取时增加了一个rbwb

 

一个面试题:

 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++关于文件的操作时用的ofstreamifstream

**********注意一点是必须增加头文件:#include<fstream.h>

**********

Win32 API 关于文件的操作:

文件的创建或打开用的CreatFile

文件的写入时:WrieFile

文件按的读取:ReadFile

例如:

 Void CFIleView::OnFileWrite()

{

 

定义一个句柄变量

HANDLE hFile;

创建文件:

hFile=CreateFile***********

接收实际写入的字节数:

DWORD dwWrite;

写入数据

WriteFile*********

关闭句柄

CloseHandlehFile );

 

 

}

参照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 <stdio.h>

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

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<NUM;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<NUM;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<boy+5;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.H是主要的含入文件,它包含了其它Windows表头文件,这些表头文件的某些也包含了其它表头文件。这些表头文件中最重要的和最基本的是:

WINDEF.H 基本型态定义。

WINNT.H 支持Unicode的型态定义。

WINBASE.H Kernel函数。

WINUSER.H 使用者接口函数。

WINGDI.H 图形设备接口函数。

 

#include <windows.h>

 

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参数就能够确定自身的其它执行实体是否正在运行。然后它可以略过一些繁杂的工作并从前面的执行实体将某些数据移到自己的数据区域。

32Windows版本中,该概念已被抛弃。传给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.LIBUSER32.LIBGDI32.LIB。这些是三个主要Windows子系统的「引用链接库」。它们包含了动态链接库的名称以及放进.EXE文件的引用信息。Windows使用该信息处理程序对KERNEL32.DLLUSER32.DLLGDI32.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 integer

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变量,而将GetStockObjectSelectObject呼叫合并成一个叙述:

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时使用的参数,可以下列三种方法之一使用定时器。

方法一

这是最方便的一种方法,它让WindowsWM_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。如果需要设定多个定时器,那么对每个定时器都使用不同的定时器IDwParam的值将随传递到窗口消息处理程序的WM_TIMER消息的不同而不同。为了使程序更具有可读性,您可以使用#define叙述定义不同的定时器ID

 

 

WM_LBUTTONDOWN

 

里面就有 坐标的x y 的值 直接取出来

 

定义:
RECT

 

POINT

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.21        

 

   今天主要讲了一下 mfc 的机制,和 简单的画图:

 

1.切记 加上头文件:#include<afxwin.H>

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. 显示 和 刷新窗口,ShowWindowhwndSW_SHOWNORMAL

                     Updatewindowhwnd

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

 

注意在CMainFrameIninInstrance 中的大小写

还有事在 设置里面加入MFC 静态 访问

 

注意:
CHellownd

定义了virtual一个 BOOL IninInstrance ()

Return true

 

还有事在CHellownd 的构造还是

 

m_pMainWnd = new CMainFrame;

m_pMainWnd 是在CThread 中定义的事一个Cwnd 类型的指针,他保存了了应用程序框架窗口对象的指针,也就是说,是指向CMainFrame 对象的指针

 

m_pMainWnd->ShowWindowSW_SHOW);

m_PMainWnd->UpdageWindow();

 

 

CMainFrame

ONPaint()函数 用于绘制 窗口

 

还用到一个ONLBUTTONDOWN UINT flagPOINT point)

其中POINT 指的是 当前坐标的位置;

 

主要代码:

一种方法是:

 

ONLBUTTONDOWN中定义 一个画笔一个化刷,创建一个矩形,调用一个ellipse函数:

CRect rect;

 

Int r = rand()%60 +1;

CClientDc   dc(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);

selectObjecthDChPen);

 

花园:

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 ARRAY100】;

Int count

 

ONLBUTTONDOWN中主要操作时:

 

 

 

 

 

Static int i=0

CRect rect;

 

Int r = rand()%60 +1;

CClientDc   dc(this);

 

dc.Rect(point.X-r, point.Y-r, point.X+r, point.Y+r);

 

ARRAY[i++] = rect;

Count = i;

还有一一个主意

 

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

selectObjecthDChPen);

 

花园:

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

    

UpdateDataFALSE);

                                  

红色的部分一定要加上 ,切记: 在密码,和个人信息匹配中也一定要加上:

 

 

 

 

 

 

类的更改步骤:

   1,删除 .C .Cpp

   2. 在文件所建的目录中招到.C .Cpp 文件进行更改;

   3, 在 .Cpp .C 中用replace 替换所有

   4,在头文件中应该改, 在用的地方也要改

 

 

创建一个非模态的对话框,可以显示好几个:

基本的步骤是:
1
,常见一个 子对话框 对应的创建一个新类: CDialog1

2, 直接用:

   CDialog1 dll;

      dll.CreateIDD_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 - > SHOWWIndowSW_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,做一个逃跑按钮:

注意函数:

 ShowWindowSW_HIDE);

 

在一个对话框上创建两个按钮,m_ButtonDown m_ButtonUp 

Shuxiang 属性:CmouseMoveBtn并添加相应的图文件:

 

创建一个CMouseMoveBtn 的类 这个类

中定一个

           CMouseMoveBtn *m_pbtnAnother

           IninInstrance中初始化

            指针为NULL

 

 

 

在在对话框上CDIALAGIninInstrance

 

M_ButtonDown.m_pbtnAnother = & m_ButtonUp

m_ButtonUp. m_pbtnAnother = & M_ButtonDown

 

CMouseMoveBtn 的类 中选择WM_CMOUSEMOVE 并产生相应的函数:

 

中添加:

        This->ShowWindowSW_HIDE

 

M_pbtnAnoter->ShowWindowSW_HIDE);

M_pbtnAnoter->ShowWindowSW_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()

}

 

Ifm_name == s&& m_mima == t

{

dll.DoModal();

}

UpdateData(FALSE);}

 

 

 

 

 

 

 

 

 

 

posted on 2010-08-21 17:27 郭龙 阅读(1070) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理