日記 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<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);
注意:**********
二進制文件和文本文件,二進制文件的讀取時增加了一個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<fstream.h>
**********
Win32 API 關于文件的操作:
文件的創建或打開用的CreatFile
文件的寫入時:WrieFile
文件按的讀?。?/span>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 <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參數就能夠確定自身的其它執行實體是否正在運行。然后它可以略過一些繁雜的工作并從前面的執行實體將某些數據移到自己的數據區域。
在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<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. 顯示 和 刷新窗口,ShowWindow(hwnd,SW_SHOWNORMAL)
Updatewindow(hwnd)
5. 定義消息結構體,開始消息循環:
MSG?。恚螅?/span>
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;
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);
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;
CClientDc dc(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, 直接用:
?。?span>Dialog1 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);}