日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mfc编程 孙鑫_以前的一些mfc的笔记(关于孙鑫的那本书)

發(fā)布時間:2024/1/1 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mfc编程 孙鑫_以前的一些mfc的笔记(关于孙鑫的那本书) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

日記2010-4-5

關(guān)于MFC中的文本的編程:

簡單是:

1,在CTestView中定義兩個變量一個為CPoint的m_ptOrigin并設(shè)置為0;和

CString的m_strLine的并設(shè)置為“”,在CTextView中。Cpp設(shè)置。

2,在CTestView中建立windows WM_CREAT中創(chuàng)建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頁。

注意幾個函數(shù):

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.

關(guān)于文本編輯時的光標的移動:

CSize sz = dc.GetTextExtent(m_strLine);

CPoint pt;

pt.x=m_ptOrigin.x+sz.cx;

pt.y=m_ptOrigin.y;

SetCaretPos(pt);

關(guān)于字體的的設(shè)置:

CFont font;

font.CreatePointFont(300,"華文行楷",NULL);

CFont *pOldFont = dc.SelectObject(&font);

。。。。。。。。。。。。。

dc.SelectObject(pOldFont);

文件操作函數(shù):

Fopen

Fseek

Ftell

Fread

Fclose

Rewind

Fflush

文件的操作

關(guān)于文件的打開和寫入:FILE *pFile=fopen("1.txt","w");

Fwrite("http://www.sunxin.org",1,strlen("http://www.sunxin.org"),pFile);

關(guān)于文件的寫入:

加入:*****

Fclose(pFile);

Fflush(pFile):

1,fseek函數(shù)可以吧文件指針從當前位置移動到指定的位置

*****************

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函數(shù)是為了獲得文件的長度

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++關(guān)于文件的操作時用的ofstream,ifstream

**********注意一點是必須增加頭文件:#include

**********

Win32 API關(guān)于文件的操作:

文件的創(chuàng)建或打開用的CreatFile

文件的寫入時:WrieFile

文件按的讀取:ReadFile

例如:

Void CFIleView::OnFileWrite()

{

定義一個句柄變量

HANDLE hFile;

創(chuàng)建文件:

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

接收實際寫入的字節(jié)數(shù):

DWORD dwWrite;

寫入數(shù)據(jù)

WriteFile(*********

關(guān)閉句柄

CloseHandle(hFile );

}

參照vc++深入編程458頁

關(guān)于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; }

}

思考:存在問題

思考下面這個函數(shù)設(shè)計有什么問題

warning C4715: 'fun' : not all control paths return a valu

必須添加return 0;

文件使用方式意 義

“rt” 只讀打開一個文本文件,只允許讀數(shù)據(jù)

“wt” 只寫打開或建立一個文本文件,只允許寫數(shù)據(jù)

“at” 追加打開一個文本文件,并在文件末尾寫數(shù)據(jù)

“rb” 只讀打開一個二進制文件,只允許讀數(shù)據(jù)

“wb” 只寫打開或建立一個二進制文件,只允許寫數(shù)據(jù)

“ab” 追加打開一個二進制文件,并在文件末尾寫數(shù)據(jù)

“rt+” 讀寫打開一個文本文件,允許讀和寫

“wt+” 讀寫打開或建立一個文本文件,允許讀寫

“at+” 讀寫打開一個文本文件,允許讀,或在文件末追加數(shù) 據(jù)

“rb+” 讀寫打開一個二進制文件,允許讀和寫

“wb+” 讀寫打開或建立一個二進制文件,允許讀和寫

“ab+” 讀寫打開一個二進制文件,允許讀,或在文件末追加數(shù)據(jù)

對于文件使用方式有以下幾點說明:

1.文件使用方式由r,w,a,t,b,+六個字符拼成,各字符的含義是:

r(read):讀

w(write):寫

a(append):追加

t(text):文本文件,可省略不寫

b(banary):二進制文件

+:讀和寫

2.凡用“r”打開一個文件時,該文件必須已經(jīng)存在, 且只能從該文件讀出。

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

}

關(guān)于結(jié)構(gòu)體:#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]用指針變量輸出結(jié)構(gòu)數(shù)組。

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

}

“聯(lián)合”與“結(jié)構(gòu)”有一些相似之處。但兩者有本質(zhì)上的不同。在結(jié)構(gòu)中各成員有各自的內(nèi)存空間,一個結(jié)構(gòu)變量的總長度是

各成員長度之和。而在“聯(lián)合”中,各成員共享一段內(nèi)存空間,一個聯(lián)合變量的長度等于各成員中最長的長度。應該說明的是, 這

里所謂的共享不是指把多個成員同時裝入一個聯(lián)合變量內(nèi),而是指該聯(lián)合變量可被賦予任一成員值,但每次只能賦一種值, 賦入

新值則沖去舊值。如前面介紹的“單位”變量, 如定義為一個可裝入“班級”或“教研室”的聯(lián)合后,就允許賦予整型值(班級)

或字符串(教研室)。要么賦予整型值,要么賦予字符串,不能把兩者同時賦予它。聯(lián)合類型的定義和聯(lián)合變量的說明一個聯(lián)合類型

必須經(jīng)過定義之后, 才能把變量說明為該聯(lián)合類型

2010 4 8日記:

#include

WINDOWS.H是主要的含入文件,它包含了其它Windows表頭文件,這些表頭文件的某些也包含了其它表頭文件。這些表頭文件中最重要的和最基本的是:

WINDEF.H基本型態(tài)定義。

WINNT.H支持Unicode的型態(tài)定義。

WINBASE.H Kernel函數(shù)。

WINUSER.H使用者接口函數(shù)。

WINGDI.H圖形設(shè)備接口函數(shù)。

#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的第一個參數(shù)被稱作「執(zhí)行實體句柄」。在Windows程序設(shè)計中,句柄僅是一個應用程序用來識別某些東西的數(shù)字。在這種情況下,該句柄唯一地標識該程序,還需要它在其它Windows函數(shù)呼叫中作為參數(shù)。在Windows的早期版本中,當同時運行同一程序多次時,您便創(chuàng)建了該程序的「多個執(zhí)行實體(multiple instances)」。同一應用程序的所有執(zhí)行實體共享程序和只讀的內(nèi)存(通常是例如菜單和對話框模板的資源)。程序通過檢查hPrevInstance參數(shù)就能夠確定自身的其它執(zhí)行實體是否正在運行。然后它可以略過一些繁雜的工作并從前面的執(zhí)行實體將某些數(shù)據(jù)移到自己的數(shù)據(jù)區(qū)域。

在32位Windows版本中,該概念已被拋棄。傳給WinMain的第二個參數(shù)總是NULL(定義為0)。

WinMain的第三個參數(shù)是用于執(zhí)行程序的命令列。某些Windows應用程序利用它在程序啟動時將文件加載內(nèi)存。WinMain的第四個參數(shù)指出程序最初顯示的方式,可以是正常的或者是最大化地充滿整個畫面,或者是最小化顯示在工作列中。我們將在第三章中介紹使用該參數(shù)的方法。

MessageBox函數(shù)用于顯示短信息。雖然,MessageBox顯示的小窗口不具有什么功能,實際上它被認為是一個對話框。

MessageBox的第一個參數(shù)通常是窗口句柄,我們將在第三章介紹其含義。第二個參數(shù)是在消息框主體中顯示的字符串,第三個參數(shù)是出現(xiàn)在消息框標題列上的字符串。在HELLMSG.C中,這些文字字符串的每一個都被封裝在一個TEXT宏中。通常您不必將所有字符串都封裝在TEXT宏中,但如果想將您的程序轉(zhuǎn)換為Unicode字符集,這確是一個好主意。我將在第二章詳細討論該問題。

MessageBox的第四個參數(shù)可以是在WINUSER.H中定義的一組以前綴MB_開始的常數(shù)的組合。您可從第一組中選擇一個常數(shù)指出希望在對話框中顯示的按鈕:

#define MB_OK 0x00000000L

#define MB_OKCANCEL x00000001L

#define MB_ABORTRETRYIGNORE 0x00000002L

#define MB_YESNOCANCEL?0x00000003L

正常情況下,在編譯階段,編譯器從C原始碼文件產(chǎn)生一個.OBJ(目標)文件。在連結(jié)階段,連結(jié)程序結(jié)合.OBJ文件和.LIB(庫)文件以建立.EXE(可執(zhí)行)文件。通過在「Project」頁面標簽上選擇「Settings」并單擊「Link」頁面標簽可以查看這些庫文件的列表。特別地,您會注意到KERNEL32.LIB、USER32.LIB和GDI32.LIB。這些是三個主要Windows子系統(tǒng)的「引用鏈接庫」。它們包含了動態(tài)鏈接庫的名稱以及放進.EXE文件的引用信息。Windows使用該信息處理程序?qū)ERNEL32.DLL、USER32.DLL、GDI32.DLL動態(tài)鏈接庫中函數(shù)的呼叫。

2010 4 9

這個問題用幾個解決方案。我首選的方案是:

while(1)

{

?}

5.用變量a給出下面的定義

a)一個整型數(shù)(An integer)

b)一個指向整型數(shù)的指針(A pointer to an integer)

c)一個指向指針的的指針,它指向的指針是指向一個整型數(shù)(A pointer to a pointer to an intege)r

d)一個有10個整型數(shù)的數(shù)組(An array of 10 integers)

e)一個有10個指針的數(shù)組,該指針是指向一個整型數(shù)的。(An array of 10 pointers to integers)

f)一個指向有10個整型數(shù)數(shù)組的指針(A pointer to an array of 10 integers)

g)一個指向函數(shù)的指針,該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)(A pointer to a function that takes an integer as an argument

and returns an integer)

h)一個有10個指針的數(shù)組,該指針指向一個函數(shù),該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)(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

人們經(jīng)常聲稱這里有幾個問題是那種要翻一下書才能回答的問題,我同意這種說法。當我寫這篇文章時,為了確定語法的正確性,我的

Static

6.關(guān)鍵字static的作用是什么?

這個簡單的問題很少有人能回答完全。在C語言中,關(guān)鍵字static有三個明顯的作用:

?;在函數(shù)體,一個被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過程中維持其值不變。

?;在模塊內(nèi)(但在函數(shù)體外),一個被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問。它是一個本地的全局變

量。

?;在模塊內(nèi),一個被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。

大多數(shù)應試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是一個應試者的嚴重的缺點,因為他顯然

不懂得本地化數(shù)據(jù)和代碼范圍的好處和重要性。

#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日,

創(chuàng)建畫刷,和畫筆HBRUSH hBrush = GetStockObject(REG(255,0,0);

呼叫selectObject將它選進設(shè)備內(nèi)容:

SelectObject (hdc, hBrush) ;

您也可以不定義hPen變量,而將GetStockObject和SelectObject呼叫合并成一個敘述:

SelectObject (hdc, GetStockObject (WHITE_PEN)) ;

如果想恢復到使用BLACK_PEN的狀態(tài),可以用一個敘述取得這種畫筆的句柄,并將其選進設(shè)備內(nèi)容:

SelectObject (hdc, GetStockObject (BLACK_PEN)) ;

Windows程序以句柄來使用畫筆。Windows表頭文件WINDEF.H中包含一個叫做HPEN的型態(tài)定義,即畫筆的句柄,可以定義這個型態(tài)的變量(例如hPen):

HPEN hPen ;

呼叫GetStockObject,可以獲得現(xiàn)有畫筆的句柄。例如,假設(shè)您想使用名為WHITE_PEN的現(xiàn)有畫筆,可以如下取得畫筆的句柄:

hPen = GetStockObject (WHITE_PEN) ;

現(xiàn)在必須將畫筆選進設(shè)備內(nèi)容:

SelectObject (hdc, hPen) ;

case WM_CREARE:

SETIMER(null,1,6000,NULL)

Case?WM_LBUTTON:

要得到窗口顯示區(qū)域的設(shè)備內(nèi)容句柄,可以呼叫GetDC來取得句柄,在使用完后呼叫 ReleaseDC:

hdc = GetDC (hwnd) ;

使用GDI函數(shù)

ReleaseDC (hwnd, hdc) ;

呼叫selectObject將它選進設(shè)備內(nèi)容:

SelectObject (hdc, hBrush) ;

化線的幾個函數(shù):

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

當您要將數(shù)組中的點連接成線時,使用Polyline函數(shù)要簡單得多。下面這條敘述畫出與上面一段程序代碼相同的矩形:

Polyline (hdc, apt, 5) ;

畫矩形:

Rectangle (hdc, 1, 1, 5, 4) ;

如果您需要在整個程序執(zhí)行期間都使用定時器,那么您將得從WinMain函數(shù)中或者在處理WM_CREATE消息時呼叫SetTimer,并在退出WinMain或響應WM_DESTROY消息時呼叫KillTimer。根據(jù)呼叫SetTimer時使用的參數(shù),可以下列三種方法之一使用定時器。

方法一

這是最方便的一種方法,它讓Windows把WM_TIMER消息發(fā)送到應用程序的正常窗口消息處理程序中,SetTimer呼叫如下所示:

SetTimer (hwnd, 1, uiMsecInterval, NULL) ;

第一個參數(shù)是其窗口消息處理程序?qū)⒔邮誛M_TIMER消息的窗口句柄。第二個參數(shù)是定時器ID,它是一個非0數(shù)值,在整個例子中假定為1。第三個參數(shù)是一個32位無正負號整數(shù),以毫秒為單位指定一個時間間隔,一個60,000的值將使Windows每分鐘發(fā)送一次WM_TIMER消息。

您可以通過呼叫

KillTimer (hwnd, 1) ;

在任何時刻停止WM_TIMER消息(即使正在處理WM_TIMER消息)。此函數(shù)的第二個參數(shù)是SetTimer呼叫中所用的同一個定時器ID。在終止程序之前,您應該響應WM_DESTROY消息停止任何活動的定時器。

當您的窗口消息處理程序收到一個WM_TIMER消息時,wParam參數(shù)等于定時器的ID值(上述情形為1),lParam參數(shù)為0。如果需要設(shè)定多個定時器,那么對每個定時器都使用不同的定時器ID。wParam的值將隨傳遞到窗口消息處理程序的WM_TIMER消息的不同而不同。為了使程序更具有可讀性,您可以使用#define敘述定義不同的定時器ID:

WM_LBUTTONDOWN

里面就有 坐標的x y的值 直接取出來

定義:RECT

POINT:

4.21晴

今天主要講了一下mfc的機制,和 簡單的畫圖:

1.切記 加上頭文件:#include

2.要明白mfc中的繼承關(guān)系

3.Cobject--ccmdtarget--cthread---cwinApp----CHellowinapp

4.Cobject---ccmdtaget--cwnd --cframewnd---

Win32 api即windows編程中關(guān)于

1.設(shè)計一個窗口類winmain中WNDCLASS wndcls;

2.注冊一個窗口類RgeisterClass

3.創(chuàng)建一個窗口類HWND hwnd

Hwnd = createwindow(")

4.顯示 和 刷新窗口,ShowWindow(hwnd,SW_SHOWNORMAL)

Updatewindow(hwnd)

5.定義消息結(jié)構(gòu)體,開始消息循環(huán):MSG msg

6.While(getMessage(&msg,NULL,0,0)

{

TranslateMessage(&msg);

DispatechMessage(&msg):

}

7.編寫窗口過程函數(shù):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中的大小寫

還有事在 設(shè)置里面加入MFC靜態(tài) 訪問

注意:在CHellownd中

定義了virtual一個BOOL IninInstrance()

Return true;

還有事在CHellownd的構(gòu)造還是

m_pMainWnd = new CMainFrame;

m_pMainWnd是在CThread中定義的事一個Cwnd類型的指針,他保存了了應用程序框架窗口對象的指針,也就是說,是指向CMainFrame對象的指針

m_pMainWnd->ShowWindow(SW_SHOW);

m_PMainWnd->UpdageWindow();

在CMainFrame中

ONPaint()函數(shù) 用于繪制 窗口

還用到一個ONLBUTTONDOWN(UINT flag,POINT point)

其中POINT指的是 當前坐標的位置;

主要代碼:

一種方法是:

在ONLBUTTONDOWN中定義 一個畫筆一個化刷,創(chuàng)建一個矩形,調(diào)用一個ellipse函數(shù):

CRect rect;

Int r = rand()%60 +1;

CClientDcdc(this);

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

調(diào)用系統(tǒng)的化刷:

HBRUSH hBrush = GetStockObject(WHITE_BRUSH);

HPEN?hPen?= GetStockObject(NULL_HPEN):

創(chuàng)建一個自己的化刷和畫筆: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中實現(xiàn)的;

在ONLBUTTONDOWN主要是為了獲得一個數(shù)組, 在窗口重繪的時候可以保留

在CMainFrame中定義一個數(shù)組和一個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);

是為了觸發(fā)onpaint

在那個onpaint的函數(shù)里面主要是:

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

調(diào)用系統(tǒng)的化刷:

HBRUSH hBrush = GetStockObject(WHITE_BRUSH);

HPEN?hPen?= GetStockObject(NULL_HPEN):

創(chuàng)建一個自己的化刷和畫筆: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晴

對話框:

模態(tài)對話框:modal

非模態(tài)對話框:modeless

Cobject -ccmdtarget-cmd--cdialog

Cproperty and cpropertyPage是常見屬性頁,和向?qū)υ捒?#xff1a;

今天做的第一個例子m_length * m_wight = m_area

主意幾點:

1。在創(chuàng)建一個對話框之后 用classwizard創(chuàng)建一個new class

并添加相應的m_length類型是int初始化是在構(gòu)造函數(shù)里面一般是m_length =0

添加的事m_name類型是CString的 初始化一般是m_name = _T("");

添加相信的m_length類型是Cedit,Cbutton或者其他的控件,

注意:是在IninInstrance中初始化的m_length.setWindowText(" 1 ");

2.創(chuàng)建一個子對話框 創(chuàng)建相應的類CDialog1

3.在父類中 創(chuàng)建一個onbutton函數(shù),(雙擊Button控件),

在里面

UpdateData();

CDialog dll;

M_area = m_ length * m_weighth;

如果是在子類的對話框中顯示:在子類的中創(chuàng)建一個m_area1的變量

dll.M_area1 = m_area;

dll.DoModal ( );

UpdateData(FALSE);

紅色的部分一定要加上 ,切記: 在密碼,和個人信息匹配中也一定要加上:

類的更改步驟:

1,刪除.C .Cpp

2.在文件所建的目錄中招到.C?.Cpp文件進行更改;

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

4,在頭文件中應該改, 在用的地方也要改

創(chuàng)建一個非模態(tài)的對話框,可以顯示好幾個:

基本的步驟是:1,常見一個 子對話框 對應的創(chuàng)建一個新類:CDialog1

2,直接用:

CDialog1 dll;

dll.Create(IDD_IDTEST_DIALOG,

dll.ShowWindow(SW_SHOWNORMAL);

只會顯示一段時間;

更改:

應該在父類 (父窗口)中創(chuàng)建一個子類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消息響應函數(shù):

WM_DESATROY

中CTEST::ONDESTORY()

{

If( dll ! = NULL)

Delete dll;

Dll = NULL;

}

屬性頁的基類:不是CDialog而是CPropertyPage

2,做一個有兩個或三個屬性頁的對話框

先建一個主的對話框,在上面添加一個Onbutton對應的是:個人信息;

再建兩個或三個屬性頁,如:個人愛好,個人信息,是在Cdialog中選擇倒數(shù)第二個,并選擇C P A,并建相應的類Chabby,和Cperson,

屬性頁的基類:不是CDialog而是CPropertyPage

然后再建一CpersonSheet繼承CPropertySheet

查MSDN關(guān)于添加屬性頁的是:

AddPage(CPropertyPage * M)

1,定義兩個屬性頁的對象:

Cperson?m_person

Chabby?m_hobby

2,在狗仔函數(shù)中的第二個添加, 也可以在兩個里面都添加:

AddPage(&m_person)

AddPage(&m_hobby);

3,在OnButton中

CpersonSheet?personinfo(“個人信息”);

Personinfo.DoModal();

3,做一個逃跑按鈕:

注意函數(shù):

ShowWindow(SW_HIDE);

在一個對話框上創(chuàng)建兩個按鈕,m_ButtonDown和m_ButtonUp

Shuxiang屬性:CmouseMoveBtn并添加相應的圖文件:

創(chuàng)建一個CMouseMoveBtn的類 這個類

中定一個

CMouseMoveBtn *m_pbtnAnother;

在IninInstrance中初始化

指針為NULL

在在對話框上CDIALAG中IninInstrance中

M_ButtonDown.m_pbtnAnother = & m_ButtonUp

m_ButtonUp. m_pbtnAnother = & M_ButtonDown

在CMouseMoveBtn的類 中選擇WM_CMOUSEMOVE并產(chǎn)生相應的函數(shù):

中添加:

This->ShowWindow(SW_HIDE)

M_pbtnAnoter->ShowWindow(SW_HIDE);

M_pbtnAnoter->ShowWindow(SW_HIDE);//好像是:SW_SHOW查一下書

創(chuàng)建一個個人信息,密碼的進入的對話框

步驟:

1.創(chuàng)建一個對話框添加相應的組件,并在兩個編輯框上創(chuàng)建相應兩個變量

2.CString的類型m_name,m_mima;

3.在創(chuàng)建一個對話框并創(chuàng)建相應的類如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);}

總結(jié)

以上是生活随笔為你收集整理的mfc编程 孙鑫_以前的一些mfc的笔记(关于孙鑫的那本书)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。