>>
Site Map
>>
Forums
>>
C/C++/C#
Forum module - topics in forum:
C/C++/C# - Ngôn ngữ lập trình cục mạnh, cho các phần mềm trên máy
Lệnh UpdateData trong VC++.NET
[MFC] Tạo shortcut kiểu shortcut của Internet Explorer
Mỗi khi chúng ta muốn tạo các shortcut cho các chương trình của chúng ta trên Desktop, những gì chúng ta làm như thường lệ là, chúng ta tạo các file .lnk cho các chương trình của mình sử dụng IShellLink. Khi mà chúng ta tạo như vậy, những gì mà chúng ta được là một biểu tượng trên desktop với một mũi tên ở góc dưới trái nó, và nếu bạn click chuột phải vào nó, bạn sẽ nhận được một menu với các mục như cut, copy, paste, delete, v.v... Nhưng nếu bạn quan sát icon shortcut của Internet Explorer trên desktop, nó thường là một icon không có mũi tên ở góc và với một menu cũng khác hẳn. (Nếu bạn quan sát Microsoft's Connection Manager, bạn sẽ thấy sự khác biệt nhiều hơn cả Internet Explorer). Lúc này để biết được làm thế nào để tạo một shortcut như thế trên desktop với một menu theo ý muốn của chúng ta.
Khi bạn thực thi code này, bạn sẽ nhận được một icon trên desktop với 'Netlinker'; là tên shortcut của nó. Nếu bạn click đúp nó, nó sẽ mở Internet Explorer và nếu bạn click chuột phải vào nó, bạn sẽ thấy một menu tùy thích mà không có các mục cut, copy, paste, rename. Bạn cũng có thể delete shortcut này từ Desktop. Nếu bạn lựa chọn properties của icon này, nó sẽ mở ra hộp thoại Internet Properties.
Implementing
Chọn một icon 32x32 pixel và chỉ rõ đường dẫn của nó:
Code:
CString shtct_ico=_T("C:\\32x32.ico");
Cái này là để hiện hộp thoại Internet Explorer properties
Code:
CString shtct_prop=_T("rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl,,0");
Cái này để tên shortcut được hiển thị trên desktop
Code:
CString shtct_name=_T("Netlinker");
Lấy đường dẫn của Internet Explorer và lưu trữ nó:
Code:
CRegKey m_Kiepath;
CString ie_path;
DWORD dwval;
m_Kiepath.Open(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\AppPaths\\IEXPLORE.EXE");
m_Kiepath.QueryValue(ie_path.GetBuffer(1000),NULL,&dwval);
m_Kiepath.Close();
String shtct_to=ie_path;
Tạo ra một GUID sử dụng guidgen.exe và copy nó vào clipboard và paste nó ở đây. Đây là GUID mà chúng ta sử dụng để đại diện cho shortcut của chúng ta và các mục của nó. Và đây, GUID mà chúng ta đã tạo ra là: 6270AEE4-AA41-11d4-A25D-008048B63F94.
Tạo ra GUID key dưới HKCR\CLSID và thiết lập tên shortcut và giá trị của nó:
Code:
CRegKey m_kdsktp;
m_kdsktp.Create(HKEY_CLASSES_ROOT,"CLSID\\{6270AEE4-AA41-11d4-A25D-008048B63F94}");
m_kdsktp.SetValue(shtct_name);
m_kdsktp.Close();
Dưới GUID, tạo một key DefaultIcon, cái này tương ứng hiển thị cho icon của shortcut, cho nên thiết lập giá trị của nó là đường dẫn của icon:
Code:
m_kdsktp.Create(HKEY_CLASSES_ROOT,"CLSID\\{6270AEE4-AA41-11d4-A25D-008048B63F94}\\DefaultIcon");
m_kdsktp.SetValue(shtct_ico);
m_kdsktp.Close();
Bây giờ thiết lập các mục cho menu cho menu khi click chuột phải. Đây là menu Open, và việc thực hiện được của nó nhờ thiết lập:
Code:
m_kdsktp.Create(HKEY_CLASSES_ROOT, "CLSID\\{6270AEE4-AA41-11d4-A25D-008048B63F94}\\Shell\\Open\\Command");
m_kdsktp.SetValue(shtct_to);
m_kdsktp.Close();
Thiết lập menu properties và việc thực hiện của nó:
Code:
m_kdsktp.Create(HKEY_CLASSES_ROOT,"CLSID\\{6270AEE4-AA41-11d4-A25D-008048B63F94}\\Shell\\Properties\\Command");
m_kdsktp.SetValue(shtct_prop);
m_kdsktp.Close();
Bây giờ thiết lập thuộc tính của menu với mục đích là các mục của menu mặc định như cut, copy, paste, rename, delete, v.v.. sẽ được gỡ bỏ.
Code:
BYTE *b;
HANDLE heap;
char a[20];
m_kdsktp.Create(HKEY_CLASSES_ROOT,"CLSID\\{6270AEE4-AA41-11d4-A25D-008048B63F94}\\ShellFolder");
strcpy(a,"00.00.00.00");
heap=HeapCreate(0,0,0);
b=(BYTE*)HeapAlloc(heap,0,30);
scanf(a,"%x.%x.%x.%x",&b[0],&b[1],&b[2],&b[3]);19/08/2001
RegSetValueEx(m_kdsktp.m_hKey,"Attributes",0,REG_BINARY,b,4);
HeapFree(heap,0,b);
HeapDestroy(heap);
m_kdsktp.Close();
Bây giờ bạn có thể tạo một tham chiếu cho GUID này dưới HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Exp lorer\Desktop\Namespace. Sau đó nó sẽ hiện ra trên desktop.
Code:
m_kdsktp.Create(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\NameSpace\\{6270AEE4-AA41-11d4-A25D-008048B63F94}");
m_kdsktp.SetValue("Netlink");
m_kdsktp.Close();
Vì chúng ta sử dụng với shell, chúng ta phải báo cho nó. Nếu không mọi thay đổi sẽ có kết quả tức thì.
Code:
SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_FLUSHNOWAIT,0, 0);
Bài viết này do Dr dịch lại từ Codeproject vì thấy nó rất có ích cho người phát triển ứng dụng. Nếu thấy chỗ nào dịch sai mong mọi người bỏ quá cho.
Bài gốc xem tại đây
http://www.codeproject.com/shell/desktopshortcut.aLệnh UpdateData trong VC++.NET
Hỏi: Lệnh UpdateData() dùng được trong VC++ 6.0 nhưng không dùng được .Net, xin hướng dẫn cách sử dụng hoặc giới thiệu lệnh tương đương. Xin hướng dẫn cách tạo icon ở status bar, dùng NOTIFYICONDATA và Shell_NotifyIcon hiện được icon nhưng di chuột đến đó thì biến mất.
Đáp:
Hàm UpdateData() được dùng để truy xuất các biến kết hợp với các đối tượng giao diện MFC. Thí dụ nếu bạn đã định nghĩa 1 biến m_text kết hợp theo trị (Category=Value) với 1 textbox thì để truy xuất đúng nội dung của textbox trong phần mềm bạn phải viết đoạn code như sau:
UpdateData(TRUE);
// đoạn lệnh truy xuất biến m_text
UpdateData(FALSE);
Lưu ý rằng lệnh UpdateData() luôn cần thiết để có thể truy xuất đúng nội dung của các điều khiển MFC của VC++ bất chấp version nào (VC++ 6.0, VC++ .Net). Tuy nhiên nếu bạn dùng VC#, VJ# hay VB .Net thì không cần dùng hàm UpdateData (hàm này không tồn tại trong các ngôn ngữ này vì không cần thiết), việc truy xuất nội dung các điều khiển giao diện trong các ngôn ngữ mới này là trong suốt.
Hàm API Shell_NotifyIcon() cho phép bạn thêm/bớt icon của phần mềm vào “System Tray” của Windows, chứ không tác động đến “Status bar” nào cả. Đoạn code VC++ sau demo việc đăng ký icon của ứng dụng vào “System tray” rồi sau đó gở bỏ:
Code:
//khai báo biến record chứa thông tin về icon cần đăng ký
NOTIFYICONDATA tnd;
//thiết lập giá trị các field cho record
tnd.cbSize = sizeof(NOTIFYICONDATA); //kích thước của record tnd
tnd.hWnd = m_hWnd; // handle cửa sổ ứng dụng
tnd.uID = 3200; // id nhận dạng icon
tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
tnd.uCallbackMessage= MYWM_NOTIFYICON; //thông báo kết hợp với icon
tnd.hIcon = m_hIcon; // handle của icon
strcpy(tnd.szTip,”MiniChatServer”); //chuỗi tooltip của icon
//đăng ký icon của ứng dụng vào System tray
Shell_NotifyIcon(NIM_ADD, &tnd);
//gở bỏ icon của ứng dụng ra khỏi System tray
Shell_NotifyIcon(NIM_DELETE, &tnd);
Theo goctinhocsp