I- TẠO GIAO DIỆN: 1.CÂU LỆNH TẠO VỊ TRÍ XUẤT HIỆN CỦA CỬA SỔ viết trong miền làm việc lopclassview->chon lop cmainfrane->precreatewindow //BOOL CMainFrame::PreCreateWindowCREATESTRUCT&
Trang 1Các câu lệnh trong lập trình c trên win
chính (main frame) của ứng dụng
Tập tin Vidu1Doc.H : chứa các khai báo liên quan đến tài liệu
hộp hội thoại,…
CVidu1App, là lớp chương trình chính
I- TẠO GIAO DIỆN:
1.CÂU LỆNH TẠO VỊ TRÍ XUẤT HIỆN CỦA CỬA SỔ (viết trong miền
làm việc (lop)classview->chon lop cmainfrane->precreatewindow)
//BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) //{
// if( !CFrameWnd::PreCreateWindow(cs) )
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
int xsize =GetSystemMetrics(SM_CXSCREEN);
int ysize =GetSystemMetrics(SM_CYSCREEN);
cs.cx=xsize*5/10;// nằm giữa màn hình
cs.cy=ysize*5/10;// nằm giữa màn hình
cs.x =(xsize-cs.cx )/2;
cs.y =(ysize-cs.cy )/2;
//return true;
Chú ý: thay vì những câu lệnh đã có sẵn trong chương trình ta ghi chép lại nên chúng ta để chúng nằm trong dấu 2 sẹt // nha
2 LOẠI BỎ MINIMIZE VÀ MAXIMIZE (viết trong miền làm việc
(lop)classview->chon lop cmainfrane->precreatewindow)
{
\\ chú thích: loại bỏ thu nhỏ phóng to
cs.style&=~(WS_MAXIMIZEBOX);
\\ chú thích: loại bỏ thu xuống thanh dưới
cs.style&=~(WS_MINIMIZEBOX);
//return true;
}
3.KHÔNG CHO THAY ĐỔI KÍCH THƯỚC CỬA SỔ LÀM VIỆC:
Trang 2(viết trong miền làm việc classview->cmainfrane->precreatewindow)
{
cs.style&=~ WS_THICKFRAME;
//return true
}
4.TẠO CỬA SỔ CỰC ĐẠI KHI ỨNG DỤNG BẮT ĐẦU CHẠY:
(Vào classview->cmainfrane-> têndự ánApp->initialized)
Đổi thành:
=> m_pMainWnd->ShowWindow(SW_ SHOWMAXIMIZED);// tao cua so cuc dai khi ung dung bat dau chay.
5 Tạo hộp thoại:
B1: Vào ResourceView-> menu->tạo tên mục trên thanh menu
Vd: Bạn muốn tao menu thông báo thì trong caption bạn gõ: &Thongbao Khi đó kết quả hiển thị bây giờ là: Thongbao
Trong đó:& là để tạo phím tắt khi chạy chương trình ta có thể bấm fím tắt cho thao tác được nhanh hơn khi chọn menu thongbao ấy bằng
Chú ý:-Trong một menu không thể tạo phím tắt giống nhau, bạn muốn tạo phím tắt kí tự nào thì chỉ cần để “&” trước kí tự đó.
Vd :t&hongbao: thì khi chạy nhấn alt+H
pop-up để bỏ dấu check.
Thí dụ như: ID_thongbao
* Lưu ý:
- Lúc này bạn không được tạo menu con ở dưới thanh menu bạn vừa mới tạo.
- Để tạo menu con bạn kích lại vào pop-up, trên thanh menu sẽ xuất hiện menu trống để bạn tạo, bạn chỉ cần kích vào đó.
- Lúc này bạn phải điền đầy đủ thông tin:
+ Caption là:tên
Để tạo phím tắt cho menu :
-> Cách 1 : dùng kí tự «& » như trên
-> Cách 2 :tên\tctrl+kí tự
Vd :&thôngbao\tctrl+T
Kết quả xuất hiện bây giờ đó là : thôngbao ctrl+t
Trang 3- Chú ý : Để cho phim tắt có hiệu lực bạn vào
Resources View->Accelerator-> IDR_MAINFRAME và tạo phím tắt ở đây.
+ ID : thì bạn đánh địa chỉ của menu vào
B2 :Vào View trên thanh công cụ-> classviewzard (hoặc Ctrl+W )
- Opject IDs:Chọn tên địa chỉ ID của menu vừa tạo
thay đổi tên thì bạn bấm ok (Dùng để tạo hộp thoại)
+ Chọn update_command_UI: làm cho câu lệnh vô hiệu lực, hoặc có hiệu lực.
pCmdUI -> Enable ( m_bWzd );
Nếu m_bWzd =TRUE thì menu trở nên hoạt động,
Nếu m_bWzd = FALSE có kết quả ngược lại.
- Chú ý: messager: chọn UPDATE_COMMAND_UI thì edit code của nó để vô hiệu hoặc có hiệu lực cho việc hiển thị bên ngoài giao diện còn ngược lại hầu hết thì ta đều chọn COMMAND
- Cú pháp tạo hộp thoại:
{
AfxMessageBox(“Thông báo", MB_YESNO);
// hiển thị chuỗi + cả 2 command yes and no để ta chọn
}
Vd:
AfxMessageBox(“bạn đã tạo thông báo thành công”,MB_OK);
6.Tạo thanh công cụ:
=>B1:Vào insert->resource->toolbar->new
- Lúc này bạn tạo thanh công cụ mới, bạn phải đặt tên địa chỉ cho thanh cộng cụ bạn vừa mới tạo bằng cách : kích chuột phải vào
IDR_TOOLBAR1-> vào propertise -> đổi tên
- Các nút công cụ bạn vừa tạo phải ghi địa chỉ ID cho nó bằng cách click chuột vào nó
Cách 2: ResourcesView->click chuột phải vào toolbar chọn insert
=>B2:Vào classview->chọn m_wndtooolbar
- Trong hàm protected bạn có thể thêm đối tượng ở hàm Ctoolbar vào bên dưới:
Ctoolbar tên_đối tượng;
Trang 4Vd: Ctoolbar hi;
=>B3: Vào CmainFrame -> oncreated() đổi tên như bước2
Vd:copy đoạn mã và đổi tên cho phù hợp
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD |
WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY |
CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
Lưu ý: - Bạn phải thay đổi các tên m_wndtoolbar => hi
Trong đó :hi là tên bạn tạo trong khai báo ở hàm ctoolbar
Và IDR_MAINFRAME phải đổi thành tên địa chỉ ID bạn đặt ở B1.
Khi việc đổi tên hoàn tất bạn có thể sắp xếp thanh công cụ bằng cách:
- Tìm đoạn mã sau:
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
Trong đó:
DockControlBar( CControlBar *pBar, UINT nDockBarID= 0);
nDockBarID : gtrị xác định vị trí thanh công cụ
AFX_IDW_DOCKBAR_TOP : Toolbar xếp vào phía trên vùng client cửa sổ
AFX_IDW_DOCKBAR_BOTTOM : Toolbar xếp vào phía dưới vùng client cửa sổ
AFX_IDW_DOCKBAR_LEFT : Toolbar xếp vào phía bên trái vùng client cửa sổ
AFX_IDW_DOCKBAR_RIGHT : Toolbar xếp vào phía bên phải vùng client cửa sổ
Vd:
hi.EnableDocking(CBRS_ALIGN_ANY);
Trang 5EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&hi,AFX_IDW_DOCKBAR_BOTTOM );
7.Thêm text vào nút toolbar :
Vào cMainfram->cú pháp này được viết trong Oncreate(…)
- Cú pháp:
SetButtonText ( int nIndex , LPCTSTR lpszText );
Xác định kích thước các nút trong toolbar và kíchước iMage SetSizes ( SIZE sizeButton , SIZE sizeImage );
Ví dụ:
hi.SetButtonText(0,_T(" mo" ));
hi.SetSizes(CSize (40,36),CSize (15,14));
Trong đó:
0 là vị trí nút cần thêm text
Hi : là tên thanh công cụ được tạo ở trên.
8.Tạo thanh trạng thái:
B1: vào fileview->source file->MainFrm.cpp
- Trong hàm “static UINT indicators[] =” bạn thêm thanh trạng thái mới Vd: ID_INDICATOR_TG,//do người dùng đặt tên
B2:khai báo vao resoure->string table-> string table ->chon hàm có
ID_INDICATOR_ rồi đặt tên cho no băng cách kích chuột phải ->new string->go tên
B2:Tạo hiển thị cho cho chỉ danh: khai báo ở phía dưới trong
MainFrm.cpp
void CMainFrame::OnUpdateStbarnew(CCmdUI* pCmdUI)
{
pCmdUI->Enable(true);
}
Trong đó: Stbarnew do người dùng đặt
B3:Vào fileview-> Header Files-> MainFrm.h
- Trong hàm protected gõ lệnh:
afx_msg void OnUpdateStbarnew(CCmdUI* pCmdUI);
B4: Trở lại bảng -> MainFrm.cpp:
- Trong hàm BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) gõ lệnh:
Trang 6ON_UPDATE_COMMAND_UI(ID_INDICATOR_TG,OnUpdateStbarnew) B5: Nhấn F7 kiểm tra lỗi và nhấn F5 để chạy.
II- CÁC HÀM ĐỒ HỌA:
1.Tạo đường thẳng:
B1:Tạo menu hoặc thanh công cụ như đã trình bày ở trên.
B2:Vào view-> classwinzar.
B3:Chọn địa chỉ ID của nút công cụ vừa mới tạo ở thanh toollbar hoặc menu
->click vào command->ok->edit code và gõ lệnh:
C1:
- Cú pháp: CDC * pDC = GetDC();; // Khai báo thiết bị DC
• ReleaseDC ( hWnd , hDC ); // Giải phóng DC
pDC -> LineTo (int X , int Y );
pDC -> MoveToEx (int X , int Y );
Vd: CDC*pDC=GetDC();
pDC->MoveTo(100,100);//tọa độ gốc
pDC->LineTo(200,200);//chiều dài hình vẽ
C2:
Khai báo:
POINT p,p1;
p.x=200 ;
p.y=200 ;
p1.x=100 ;
p1.y=100 ;
CDC*pDC=GetDC();
pDC->MoveTo(p1); //tọa độ gốc
pDC->LineTo(p); //chiều dài hình vẽ
2. Hình chữ nhật : ( viết tượng tự như ở các bước tạo đường thẳng)
=> Hình chữ nhật thường :
- Cú pháp :
pDC -> Rectangle (int upX , int upY , int lowX , int lowY );
upX , upY : góc trên bên trái
vd:
CDC*pDC=GetDC();
pDC -> Rectangle(200,200,400,300);
=> Hình chữ nhật vuông:
Trang 7- Cú pháp:
pDC-> RoundRect (int x1, int y1, int x2, int y2, int x3, int y3)
vd : CDC*pDC=GetDC();
pDC-> RoundRect(200,200,400,300,50,50);
3.Hình elip ( viết tượng tự như ở các bước tạo đường thẳng)
- Cú pháp:
pDC-> Ellipse (int upX , int upY , int lowX , int lowY );
vd:
CDC*pDC=GetDC();
pDC->Ellipse(400,400,600,500);//(400,200,600,400)hình tròn
4.Vẽ Pie(Hình tròn Khuyết): ( viết tượng tự như ở các bước tạo đường thẳng)
- Cú pháp:
pDC-> pie (int upX , int upY , int lowX , int lowY, int Xs, int Ys, int Xe, int Ye);
upX , upY : góc trên bên trái
Xs, Ys: Điểm bắt đầu cung
Xe, Ye: Điểm kết thúc cung
Vd:
CDC*pDC=GetDC();
pDC->Pie(100,100,200,200,150,100,200,150);//
( 400,200,600,400,500,100,600,300) 5.Đường Liền Kề Nhau: ( viết tượng tự như ở các bước tạo đường thẳng)
- Cú pháp:
pDC-> Polyline(POINT pt, int n);
n : số lượng tọa độ
vd:
POINT pt[10];
{ int x;
int y;
}
Trang 8pt[0].y=300;
pt[1].x=250;
pt[1].y=200;
pt[2].x=300;
pt[2].y=300;
pt[3].x=350;
pt[3].y=200;
pt[4].x=400;
pt[4].y=300;
CDC*pDC=GetDC();
pDC->Polyline(pt,5);
6.Tạo thuộc tính bút vẽ : ( viết tượng tự như ở các bước tạo đường thẳng)
- Cú pháp :
CPen pen (int style , int width, COLOREF color );
• Style : kiểu bút vẽ và có các giá trị:
• Color: RGB(R, G, B)
CPen *pPen = pDC->SelectObject(&pen) //thiết lập
Vd:
CPen pen(PS_SOLID,3,RGB(19,211,65));
CPen*pPen = pDC->SelectObject(&pen) ;
- Chú ý: Phải đặt trước lệnh tạo đồ họa.
7.Tạo chổi quét ( Tạo màu nền)// (viết tượng tự như ở các bước tạo đường
thẳng)
-Cú pháp:
Cbrush Brush (COLOREF color )
• Color: RGB( R , G , B )
Thiết lập chổi quét :
CBrush *pBrush = pDC->SelectObject (&Brush)
- Chú ý: Phải đặt trước lệnh tạo hình vẽ ý
Vd: CBrush Brush(RGB(0,255,0));
Trang 9CBrush*pBrush = pDC->SelectObject(&Brush);
- HS_BDIAGONAL:
- HS_CROSS:
- HS_DIAGCROSS:
- HS_FDIAGONAL:
- HS_HORIZONTAL:
- HS_VERTICAL:
Vd:
CBrush Brush(HS_VERTICAL,RGB(0,250,0));
CBrush*pBrush = pDC->SelectObject(&Brush);
8.Tạo text lên cửa sổ:( tương tự)
- Cú pháp:
pDC -> TextOut( x, y, string, strLength);
pDC-> SetTextAlign(TA_CENTER) // hàm thiết lập
Trong đó:
pDC là device context của cửa sổ cần xuất.
x, y điểm bắt đầu của chuỗi ký tự trong client
string là một con trỏ trỏ đốn một chuỗi ký tự
strLength là số ký tự trong chỗi cần xuất.
Ví dụ:
void CMainFrame::Ontraitim()
{
// TODO: Add your command handler code here
CDC*pDC=GetDC();
CString str("Ban co mot trai tim tinh khuyet");
pDC->TextOut(400,100,str, str.GetLength());
pDC-> SetTextAlign(TA_CENTER) ; }
9 Thiết lập màu chữ : (Phải đặt trước lệnh tạo text.)
pDC-> SetTextColor(COLOREF color);
Vd:
CDC*pDC=GetDC();
pDC-> SetTextColor(RGB(250,0,0));
Trang 10 Thiết lập màu nền (Phải đặt trước lệnh tạo text.)
pDC-> SetBkColor(COLOREF color)
Vd:
CDC*pDC=GetDC();
pDC-> SetBkColor(RGB(250,0,0));
VD:Tạo hình người viết trong mainfrm.cpp:
CDC*pDC=GetDC();
pDC->Ellipse(400,100,500,200);
pDC -> Rectangle(440,200,460,230);//co pDC -> Rectangle(370,228,530,400);//than pDC->Ellipse(423,125,443,133);
pDC->Ellipse(463,125,483,133);//MAT
pDC->MoveTo(453,140);
pDC->LineTo(444,155);
pDC->MoveTo(453,140);//MUI pDC->LineTo(462,155);
pDC->MoveTo(444,155);
pDC->LineTo(462,155);
pDC->MoveTo(453,180);//MIENG pDC->LineTo(428,170);
pDC->MoveTo(453,180);
pDC->LineTo(473,170);
pDC->MoveTo(370,228);
pDC->LineTo(290,420);
pDC->MoveTo(370,290);//taytrai pDC->LineTo(300,420);
pDC->MoveTo(290,420);
pDC->LineTo(302,420);
pDC->MoveTo(530,230);
pDC->LineTo(610,420);
pDC->MoveTo(530,290);//tayphai pDC->LineTo(600,420);
pDC->MoveTo(600,420);
pDC->LineTo(611,420);
Trang 11pDC->MoveTo(370,400);
pDC->LineTo(355,600);
pDC->MoveTo(450,450);
pDC->LineTo(375,600);//chan pDC->MoveTo(530,400);
pDC->LineTo(545,600);
pDC->MoveTo(450,450);
pDC->LineTo(525,600);
pDC->MoveTo(355,600);
pDC->LineTo(375,600);
pDC->MoveTo(525,600);
pDC->LineTo(545,600);
CBrush Brush(RGB(50,250,0));
CBrush *pBrush = pDC->SelectObject (&Brush);
pDC->MoveTo(370,385);
pDC->LineTo(530,385);
pDC -> Rectangle(440,385,460,400);//thaclung
pDC-> SetTextColor(RGB(0,0,0));
pDC-> SetBkColor(RGB(250,0,0));
CString str("CHAO CAC BAN!!");// tao text pDC->TextOut(400,80,str, str.GetLength());
pDC-> SetTextAlign(TA_CENTER) ; 10.Thuật vẽ Bitmap(chèn ảnh):
B1:tạo menu hoặc tool
B2:Tạo nguồn Bitmap trong tập tài nguyên có đuôi rc bằng cách:
Chọn file ->open->chọn đuôi rc(trong save as chọn text)->open->gõ lệnh tạo nguồn vào hình cần chèn
Vd: ID_BITMAP BITMAP "C:\HINH\h.bmp"
ID do người dùng đặt
B3:vào classwinzard->chọn địa chỉ cần thực hiện(lớp cmainfram)
->command(kích đôi)->edit code
B4:gõ lệnh:
CBitmap bm;//khai báo
bm.LoadBitmap(ID_BITMAP);//nạp bitmap từ tài nguyên.
CDC*pDC=GetDC();
CDC mDC;
mDC.CreateCompatibleDC(pDC); //Đạt được DC của bộ nhớ sẽ chứa bitmap
Trang 12mDC.SelectObject(bm);// Chọn bitmap trong device context của
bộ nhớ.
BITMAP TT;//khai báo bm.GetObject(sizeof(TT),&TT);//nhập thông tin của bitmap pDC->BitBlt (100,300,TT.bmWidth,TT.bmHeight,&mDC,0,0,SRCCOPY);
//Sao chép bitmap từ DC của bộ nhớ sang DC của cửa sổ.
-Trong đó: bm,TT , m DC:do người lập trình đặt.
B5: vào resouce.h định nghĩa.
#define ID_BITMAP 32804 //số này không trùng với số
ở phía trên.
B6:chạy chương trình
11.Tạo font cho text:
B1: tạo ra text đã học ở trên
B2:thiết lập font:được viết trên text
CFont Font;//do ngườ lập trình đặt tên
B3: gọi
Font CreateFont để tạo ra font có thuộc tính xác định
Font.CreateFont(int Height, //kích thước điểm
0, 0, 0, FW_NORMAL, // Độ dầy, có thể là FW_BOLD
0, // nếu 1 nghiêng
0, // Nếu 1 gạch dưới
0, //nếu 1 gạch ngang 0,0, 0, 0,0,“VNI-Times”); //kiểu chữ
B4: Gọi SelectObject() cài đặt Font vào vùng client
Font.CreateFont(40,0,0,0,FW_BOLD,0,1,0,0,0,0,0,0,"VNI-Times"); CFont *pFont = (CFont *) pDC->SelectObject(&Font);
SetFont(pFont);//thiết lập
Vd: void CMainFrame::Onhi()
{
// TODO: Add your command handler code here CDC*pDC=GetDC();
CFont f;
f.CreateFont(40,0,0,0,FW_BOLD,0,1,0,0,0,0,0,0,"VNI-Times"); CFont *pFont = (CFont *) pDC->SelectObject(&f);
Trang 13CString str("bạn đã tạo font chữ thành công!!");
pDC->TextOut(400,300,str, str.GetLength());
pDC-> SetTextAlign(TA_CENTER) ; }
III-HÀM XỮ LÝ THƠNG ĐIỆP CHUỘT:
1).Tạo hình khi nhấn chuột:
B1:tạo nút tool hoặc menu
B2: vào classwinzard chọn lớp view, chọn thơng điệp chuột trong messages
B3:khai báo biến bằng cách kích chuột phải vào lớp view chọn Add Member
Varible…gõ kiểu và biến do người lập trình đặt.
Vd:tạo hình chữ nhật và đường thẳng
B1:trong thơng điệp chuột OnLButtonDown
void CBaitap2View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (hinh==1)
{
if (lc==1) {
pl.x=point.x;
pl.y=point.y ; lc=2;
} else
{ CDC*pDC=GetDC();
CBrush Brush (RGB(200,100,0));
CBrush *pBrush = pDC->SelectObject (&Brush);
pDC->Rectangle(pl.x,pl.y,point.x,point.y);
lc=1;
} }
if (hinh==2)
{
if (lc==1) {
pl.x=point.x;