Tạo các điều khiển ActiveX của riêng bạn

1. Giới thiệu

yếu tố kiểm soát ActveX – một tập tin với phần mở rộng OCX (ví dụ, MyButton.OCX), mà bạn có thể sử dụng trong ứng dụng của bạn Visual C ++. Visual C ++ và ngôn ngữ lập trình trực quan khác cho phép bạn kích hoạt các điều khiển ActiveX trong chương trình và sử dụng nó trong cùng một cách như kiểm soát ++ Visual C chuẩn. Bạn đặt điều khiển ActiveX trong hộp thoại, thiết lập thuộc tính của nó và liên kết mã với các sự kiện của nó. Sau khi bạn đã tạo điều khiển ActiveX của riêng mình, bạn có thể chuyển nó cho các lập trình viên khác có thể nhập nó vào các chương trình của họ.

Bởi vì phần mở rộng tệp điều khiển ActiveX là .OSX, đôi khi điều khiển ActiveX được gọi là các phần tử OSX. Trong chương này, bạn sẽ phát triển kiểm soát của bạn riêng ActiveX – MyClock.OSKH, thực hiện nhiệm vụ của màn hình hiển thị thời gian hiện tại. Khi các lập trình viên đặt các điều khiển MyClock.OXX trong các hình thức hoặc trong hộp thoại, MyClock. OCX sẽ liên tục hiển thị thời gian hiện tại.

 

2. Tạo một dự án

Để tạo một dự án điều khiển MyClock.OCX:

1) Chọn Mới từ trình đơn Tệp. Đáp lại, Visual C ++ hiển thị hộp thoại Mới. 2) Chọn tab Dự án của hộp thoại Mới. 3) Chọn MFC ActiveX ControlWizard từ danh sách các loại dự án 4) Kiểu MyClock trong cửa sổ Tên Dự án. 5) Nhấp vào nút nằm ở phía bên phải của cửa sổ Vị trí và chọn thư mục cho dự án. 6) Nhấp vào nút OK. Để đáp ứng, Visual C ++ sẽ hiển thị cửa sổ MFC ActiveX ControlWizard Bước 1 trong 2 Trong cửa sổ ActiveX ControlWizard Bước 1, để tất cả các thiết lập ở trạng thái mặc định và nhấp vào nút Tiếp theo. Trong ActiveX ControlWizard Bước 2, để tất cả các thiết lập ở trạng thái mặc định và nhấp vào nút Finish. Đáp lại, Visual C ++ hiển thị hộp thoại New Project Information. Nhấn OK trong hộp thoại New Project Information và chọn Set Active Configuration từ thực đơn Build. Đáp lại, Visual C ++ hiển thị hộp thoại Set Active Project Configuration. Chọn MyClock – Win32 Release trong hộp thoại Set Active Project Configuration và kích OK. Đó là tất cả! Bạn đã hoàn thành việc tạo ra các dự án tập tin và các wireframes của MyClock ActiveX kiểm soát các tập tin.

 

3. Thiết lập biểu tượng công cụ MyClock

Biểu tượng công cụ MyClock hiển thị các ký tự OCX. Bạn cần phải cấu hình kiểm soát MyClock để biểu tượng công cụ của nó là một đồ họa đồng hồ. Để cấu hình biểu tượng công cụ MyClock, bạn phải chỉnh sửa bitmap IDB_MYCLOCK. Hình ảnh này được tạo ra bởi Visual C ++. Để hiển thị bitmap IDB_MYCLOCK trong chế độ thiết kế, hãy thực hiện theo các bước sau:

1) Chọn thẻ ResourceView trong cửa sổ Workspace Workspace, mở rộng tài nguyên MyClock, mở rộng mục Bitmap, và nhấp đúp vào IDB_MYCLOCK. Đáp lại, Visual C ++ sẽ hiển thị bitmap IDB_MYCLOCK trong chế độ thiết kế. 2) Sử dụng các công cụ trực quan của Visual C ++, thay thế hình ảnh raster IDB_MYCLOCK của các chữ cái OCX với bản vẽ của đồng hồ đơn giản nhất (vòng tròn và hai dòng như các mũi tên).

 

 

4. Vẽ trong kiểm soát MyClock

Trong khi điều khiển MyClock hiển thị một hình elip. Bạn cần MyClock để hiển thị thời gian hiện tại, vì vậy bạn cần phải viết mã thích hợp: Mở tập tin MyClockCtl.cpp. Tệp MyClockCtl.cpp là tệp thực hiện cho kiểm soát MuClock mà bạn đã tạo cho Visual C ++; Trong tệp này, bạn sẽ viết mã của bạn để cấu hình MyClock. Tìm hàm OnDraw () trong MyClockCtl.cpp và viết đoạn mã sau:

VOID CMYCLOCKCTRL :: ONDRAW (CDC * PDC, CONST CRECT & RCBOUNDS, CONST CRECT & RCINVALID) { // TODO: THAY THẾ MÃ SAU BẰNG BẢN VẼ CỦA RIÊNG BẠN // CODE. / / ĐỔ ĐIỀU KHIỂN BẰNG MÀU ĐÃ CHỌN. PDC-> FILLRECT (RCBOUNDS, CBRUSH :: FROMHANDLE ((HBRUSH) GETSTOCKOBJECT (WHITE_BRUSH)))); CHAR CURRENTTIME [30]; STRUCT TM * NEWTIME; DÀI LTIME; // LẤY THỜI GIAN HIỆN TẠI THỜI GIAN (& LTIME); NEWTIME = LOCALTIME (& LTIME); // CHUYỂN ĐỔI THỜI GIAN THÀNH MỘT CHUỖI. STRCPY (CURRENTTIME, ASCTIME (NEWTIME)); / / HOÀN THÀNH DÒNG VỚI MỘT KÝ TỰ KHÔNG GIAN. CURRENTTIME [24] = ”; // THÊM MỘT CHUỖI HẠN CHẾ KÝ TỰ. CURRENTTIME [25] = 0; // IN THỜI GIAN HIỆN TẠI PDC-> EXTTEXTOUT (RCBOUNDS.LEFT, RCBOUNDS.TOP, ETO_CLIPPED, RCBOUNDS, CURRENTTIME, STRLEN (CURRENTTIME), NULL); }
 

 

5. Hiển thị thời gian hiện tại ở chế độ liên tục

Để hiển thị thời gian liên tục, bạn cần phải thực hiện theo các bước sau: 1) Viết mã lệnh đặt một bộ đếm thời gian với khoảng thời gian 1000 millisecond cho điều khiển MyClock. 2) Liên kết mã với sự kiện WM_TIMER của điều khiển MyClock. Sau khi thiết lập bộ định thời mỗi 1000 mili giây (mỗi giây), Windows sẽ gửi một thông báo WM_TIMER đến bộ điều khiển MyClock, để đáp ứng mã mà bạn liên kết với sự kiện điều khiển này sẽ được thực hiện. Mã này sẽ đơn giản xuất ra thời gian hiện tại, vì vậy giá trị thời gian sẽ được cập nhật liên tục. Bộ đếm thời gian phải được cài đặt ngay sau khi tạo điều khiển, vì vậy bạn cần kết hợp mã để đặt thời gian cho sự kiện WM_CREATE của điều khiển: Hiển thị hộp thoại ClassWizard bằng cách chọn ClassWizard từ trình đơn View. Trên trang Bản đồ Thư, hãy chọn sự kiện sau:

Tên Lớp: CMyClockCtrl Tổ Chức ID: CMyClockCtrl Thư: WM_CREATE

Nhấp vào nút Thêm chức năng. Đáp lại, Visual C ++ sẽ thêm hàm OpCreate () vào lớp CMyClockCtrl. Nhấp vào nút Chỉnh sửa mã trong ClassWizard. Đáp lại, Visual C ++ sẽ mở tệp MyClockCtrl.cpp với chức năng OnCreate () trong chế độ chỉnh sửa. Viết mã sau trong hàm OnCreate ():

INT CMYCLOCKCTRL :: ONCREATE (LPCREATESTRUCT LPCREATESTRUCT) { NẾU (COLECONTROL :: ONCREATE (LPCREATESTRUCT) == -1) RETURN -1; // TODO: THÊM MÃ TẠO ĐẶC BIỆT CỦA BẠN Ở ĐÂY // ĐẶT HẸN GIỜ. SETTIMER (1, 1000, NULL); TRỞ LẠI 0; }
 

bạn nhập mã bao gồm một nhà điều hành duy nhất, mà làm cho SetTimer () để thiết lập bộ đếm thời gian đến 1000 thời gian ms:

SetTiltier (1, 1000, NULL);

Từ bây giờ, mỗi 1000 mili giây Windows sẽ gửi một thông báo WM_TIMER tới bộ điều khiển. Bây giờ bạn cần liên kết mã với sự kiện WM_TIMER: Chọn ClassWizard từ trình đơn View. Trên trang Bản đồ Thư, hãy chọn sự kiện sau:

Tên Lớp: CMyClockCtrl ID đối tượng: CMyClockCtrl Message: WM_TIMER

Nhấp vào nút Thêm chức năng. Đáp lại, Visual C ++ sẽ thêm chức năng OnTimer () vào lớp CMyClockCtrl. Nhấp vào nút Chỉnh sửa mã trong ClassWizard. Đáp lại, Visual C ++ sẽ mở tệp MyClockCtrl.cpp với chức năng OnTimer () trong chế độ chỉnh sửa. Viết mã sau trong hàm OnTimerO:

VOID CMYCLOCKCTRL :: ONTIMER (UINT NIDEVENT) { // TODO: THÊM MÃ TRÌNH XỬ LÝ THƯ CỦA BẠN Ở ĐÂY VÀ / HOẶC GỌI / / MẶC ĐỊNH // CHUYỂN CUỘC GỌI ĐẾN CHỨC NĂNG ONDRAW (). INVALIDATECONTROL (); COLECONTROL :: ONTIMER (NIDEVENT); }
 

 

 

6. Cho phép các thuộc tính cơ bản trong ActiveX MyClock

Các thuộc tính cơ bản (Thuộc tính cổ phiếu) được xác định trước. Dưới đây là danh sách các thuộc tính cơ bản:

Dáng vẻ bên ngoài – Xuất hiện (3 chiều hoặc bằng phẳng) BackColor – Màu nền BorderStyle – Khung Kiểu Chú thích – Tiêu đề Enabled – Tình trạng có sẵn / không có sẵn Font – Font ForeColor – màu Foreground hWnd – Marker cửa sổ readyState – Ready Status chữ – Text

Để thực hành, chúng tôi bao gồm hai thuộc tính cơ bản trong ActiveX MyClock: BackColor và ForeColor. Làm như sau:

View -> ClassWizard -> Tự động hóa (proverte đến lớp CMyClockCtrl cài đặt trong tên lớp cửa sổ) Nhấn vào nút Thêm tài sản Chọn BackColor từ danh sách và nhấn OK Ngoài ra thêm và tài sản ForeColor.

Bộ điều khiển MyClock bây giờ có thuộc tính BackColor và ForeColor, nhưng chưa sử dụng các giá trị được lưu trữ trong các thuộc tính này. Bạn cần viết mã trong hàm OnDraw (), thực hiện công việc này:

VOID CMYCLOCKCTRL :: ONDRAW (CDC * PDC, CONST CRECT & RCBOUNDS, CONST CRECT & RCINVALID) { // TODO: THAY THẾ MÃ SAU BẰNG BẢN VẼ CỦA RIÊNG BẠN // CODE. / / ĐẶT MÀU NỀN TRƯỚC (MÀU CHỮ) PDC-> SETTEXTCOLOR (DỊCHCOLOR (GETFORECOLOR ())); // ĐẶT CHẾ ĐỘ NỀN TRONG SUỐT PDC-> SETBKMODE (TRANSPARENT); // TẠO MỘT BÀN CHẢI DỰA TRÊN GIÁ TRỊ BACKCOLOR CBRUSH BKBRUSH (DỊCHCOLOR (GETBACKCOLOR ())); // SƠN NỀN PDC-> FILLRECT (RCBOUNDS, & BKBRUSH); CHAR CURRENTTIME [30]; STRUCT TM * NEWTIME; DÀI LTIME; // LẤY THỜI GIAN HIỆN TẠI THỜI GIAN (& LTIME); NEWTIME = LOCALTIME (& LTIME); // CHUYỂN ĐỔI THỜI GIAN THÀNH MỘT CHUỖI. STRCPY (CURRENTTIME, ASCTIME (NEWTIME)); / / HOÀN THÀNH DÒNG VỚI MỘT KÝ TỰ KHÔNG GIAN. CURRENTTIME [24] = ”; // THÊM MỘT CHUỖI HẠN CHẾ KÝ TỰ. CURRENTTIME [25] = 0; // IN THỜI GIAN HIỆN TẠI PDC-> EXTTEXTOUT (RCBOUNDS.LEFT, RCBOUNDS.TOP, ETO_CLIPPED, RCBOUNDS, CURRENTTIME, STRLEN (CURRENTTIME), NULL); }
 

Vâng đó là tất cả, bây giờ kiểm soát MyClock có các thuộc tính của BackColor và ForeColor.

 

7. Cho phép một thuộc tính đặc biệt trong ActiveX MyClock

Trong nhiều trường hợp, bạn sẽ cần đưa vào thuộc tính kiểm soát của mình mà không có trong danh sách chuẩn. Những đặc tính này được gọi là đặc biệt. Ví dụ, hãy bao gồm thuộc tính UpdateInterval đặc biệt trong MyClock – thời gian cập nhật:

View -> ClassWizard -> Tự động hóa (proverte tên cửa sổ lớp học được đặt lớp CMyClockCtrl) Click vào nút tài sản Thêm trong cửa sổ bên ngoài tên loại UpdateInterval Trong các Loại hộp, chọn Dài Trong Tên biến phải m_updateinterval Cửa sổ chức năng thông báo đưa OnUpdateIntervalChanged Kiểm tra xem Đảm bảo rằng nút Thành viên được chọn trong quá trình triển khai thực hiện và nhấp vào OK

Do đó, chúng tôi đã xác định rằng với tài sản UpdateInterval được liên kết m_updateinterval biến và bất cứ khi nào giá trị tài sản UpdateInterval imenyatsya sẽ tự động thực hiện chức năng OnUpdateIntervalChanged. Bây giờ bạn cần phải khởi tạo thuộc tính UpdateInterval:

Mở tập tin MyClockCtl.cpp Tìm () chức năng và napishiet DoPropExchange trong nó như sau: // Khởi tạo thuộc tính UpdateInterval đến 1000 PX_Long (PPX, _T ( «UpdateInterval »), m_updateinterval, 1000);

Bây giờ chúng ta cần phải cập nhật các chức năng OnUpdateIntervalChanged:

// kiểm tra otrizatelnost if (m_updateinterval <0) { MessageBox ( «tài sản này có thể không phải là BE tiêu cực !!!»); m_updateinterval = 1000; } // Thiết lập bộ đếm thời gian SetTimer (1, (UINT) m_updateinterval, NULL) ;

và OnCreate:

/ / Thiết lập bộ đếm thời gian SetTimer (1, (UINT) m_updateinterval, NULL);

Read More

Làm thế nào để tải tập tin qua ftp?

Một khi tôi thiết kế tiện ích đơn giản để được sử dụng như ftp downloader để lấy cập nhật phần mềm từ máy chủ từ xa. Xem dự án làm việc cho MSVS6 để biết chi tiết. Ở đó bạn có thể tìm thấy:

  • làm thế nào để tạo ra phiên Internet
  • làm thế nào để thiết lập kết nối ftp
  • làm thế nào để sử dụng OnStatusCallbackchức năng
  • làm thế nào để liệt kê và duyệt danh sách các tập tin máy chủ ftp
  • làm thế nào để hiển thị biểu tượng liên kết cho mở rộng tập tin trong CListCtrl
  • làm thế nào để hiển thị tiến bộ trong khi tải tập tin
  • làm thế nào để tạo ra chủ đề cho các tập tin tải về và gián đoạn tải
  • cách duyệt đĩa cục bộ
  • làm thế nào để xử lý ngoại lệ
  • làm thế nào để sử dụng con trỏ động
Read More

Làm thế nào để chương trình cổng nối tiếp trong Windows?

Làm thế nào để chương trình cổng nối tiếp trong Windows?

Đối với truyền thông nối tiếp theo Windows cách tiếp cận phổ biến là sử dụng các chức năng API hoặc lớp bên thứ ba mà bao bọc chúng. Không có nhiều truy cập trực tiếp vào cổng đăng ký, nếu bạn không phát triển trình điều khiển thiết bị, của cource (đối với Win9x bạn vẫn có thể sử dụng như kỹ thuật-DOS-như lập trình, nhưng trong Win NT / 2K quên nó!).

Trước tiên, hãy xem những gì MSDN nói ở đây hoặc ở đây cho điều này. Nếu bạn vẫn không hài lòng truy cập vào CodeProject để tìm lớp wrapper cổng COM thích hợp . Cuối cùng, cũng có một điều khiển Microsoft ActiveX có tên MSComm cho mục đích này, nhưng hãy cẩn thận …

Read More

Tại sao tôi cần một destructor ảo?

Destructor ảo là một thực thể thiết yếu nếu bạn sử dụng thừa kế. Destructor ảo được khai báo trong một lớp cơ sở. Nó đảm bảo rằng đối với tất cả các lớp có nguồn gốc từ lớp cơ sở tất cả các destructors: 1) sẽ được gọi và 2) sẽ được gọi theo thứ tự đúng. Nó tạo ra một hành vi đa hình. Hãy xem đoạn trích dưới đây:

#include "stdio.h"

lớp BaseClass
{
	int id;
công cộng:
	BaseClass () {printf ("BaseClass () \ n"); }
	ảo ~ BaseClass () {printf ("~ BaseClass () \ n"); } // !!!
};

lớp Class1: public BaseClass
{
	int id;
công cộng:
	Class1 () {printf ("Class1 () \ n"); }
	~ Class1 () {printf ("~ Class1 () \ n"); }
};

lớp Class2: public Class1
{
	int id;
công cộng:
	Class2 () {printf ("Class2 () \ n"); }
	~ Class2 () {printf ("~ Class2 () \ n"); }
};


int main (int argc, char * argv [])
{
	BaseClass * p = new Class2;
	xóa p;

	trở lại 0;
}

Đầu ra trong trường hợp không có destructor ảo là:

BaseClass ()
Class1 ()
Lớp 2 ()
~ BaseClass ()

Nhưng đầu ra trong trường hợp với destructor ảo khác:

BaseClass ()
Class1 ()
Lớp 2 ()
~ Lớp 2 ()
~ Lớp 1 ()
~ BaseClass ()

Bây giờ bạn thấy những gì sẽ xảy ra nếu destructor nên gọi delete()cho một số đối tượng / mảng được sử dụng trong lớp học? Tiếp tục: sử dụng destructor ảo để đảm bảo thanh toán bù trừ bộ nhớ chính xác trong trường hợp sử dụng thừa kế.

Read More