MFC學習筆記


獲取窗口句柄

  • FindWindow                根據窗口名獲取
  • GetSafehWnd                取你程序所在窗口類的句柄
  • GetActiveWindow          取當前活動窗口句柄
  • AfxGetMainWnd            取主窗口句柄
  • GetForegroundWindow   取前台窗口句柄

窗口對象和CWnd對象,Attach和Detach函數

  CWnd對象實際上並沒有把整個Windows對象都包裝在其中,它只是有一個窗口句柄。(在MSDN上查看CWnd類的成員變量,確實只有一個HWND hWnd,成員函數有Attach()和Dettach()、Create()等)。這個窗口句柄如果指向一個實際存在的窗口對象,那么這個CWnd對象就是有效的;否則是空的。

  如果你還不明白,請回憶一下,當我們使用MFC創建一個窗口時,是分兩步進行的:

  1. new一個CWnd對象,但其中的HWND還是非法的,因為對應的窗口對象還沒有被創建出來;
  2. 調用CWnd的成員函數Create創建真正的窗口對象,同時,把先前創建的MFC的CWnd對象的HWND成員指向該窗口,這樣才算創建完畢一個窗口。

  而如果你是用SDK方式,那么只要創建一個WNDCLASS結構,然后調用Create或者CreateEx就創建了一 個窗口。

  讓一個有效窗口句柄和一個CWnd對象關聯起來用Attach:就是讓一個CWnd對象的HWND成員等於這個窗口句柄;Attach,通俗地說,就是切斷一個CWnd對象和一個有效窗口的臍帶。因為CWnd是C++的對象,C++的對象有一個生存期的概念,脫離了該對象的作用域,這個對象就要被銷毀,但是窗口對象沒有這個特點,當銷毀 CWnd對象的時候,我們不一定希望WNDCLASS一起被銷毀,那么在此之前,我們就先要把這個“臍帶”剪斷,以免“城門失火,殃及池魚”。

不要在子線程中操作MFC控件  

  不要在線程函數體內操作MFC控件,因為每個線程都有自己的線程模塊狀態映射表,在一個線程中操作另一個線程中創建的MFC對象,會帶來意想不到的問題。更不要在線程函數里,直接調用UpdataData()函數更新用戶界面,這會導致程序直接crash。而應該通過發送消息給主線程的方式,在主線程的消息響應函數里操作控件

類之間的相互訪問

  MFC中一個類要訪問另外一個類的的對象的成員變量值,就需要獲得原來那個類對象的指針,其實有好幾種方法都可以實現。比如維護一個單例模式、設置靜態變量等等。這里舉個例子,實現多個類之間的相互訪問。

(1)創建一個MFC對話框應用程序,命名為Visit工程,對話框本身有一個主界面(CVisitDlg對話框),我們再添加一個新界面CXXXDlg。

(2)在主界面CVisitDlg類的頭文件中,添加一個static CVisitDlg *s_pDialog;指針。由於這個指針式靜態的,需要在類外初始化,那么在CVisitDlg .cpp文件中,寫上一行初始化代碼,直接初始化為空,如下:

CVisitDlg *CVisitDlg::s_pDialog = NULL; //注意要寫在類外,不要寫在類實現函數里面

(3)然后需要在CVisitDlg主對話框生成的時候,給這個指針賦值為主對話框指針,在CVisitDlg 類的構造函數或者OnInitDialog()函數里面寫上如下一句代碼:

s_pDialog = this;

  現在只要在其他的類里面獲得這個靜態指針,就可以訪問這個類里面的所有數據了。

(4)獲得靜態指針,如果在CXXXDlg類中訪問CVisitDlg類的數據,如下代碼即可實現:

CVisitDlg *pDia = CVisitDlg::s_pDialog 

注意: 

  初始化是賦一個初始值,而定義是分配內存。

  靜態成員變量在類中僅僅是聲明,沒有定義,所以要在類的外面定義,實際上是給靜態成員變量分配內存

  對於類來說,new一個類對象不僅會分配內存,同時會調用構造函數進行初始化,所以類對象的定義和初始化總是關聯在一起。

解決MFC啟動時隱藏的閃爍問題

(1)VC++ 6.0開發的單文檔程序

  在BOOL CXXXXApp::InitInstance()方法中添加如下代碼:

m_nCmdShow = SW_HIDE;

if (!ProcessShellCommand(cmdInfo))
    return FALSE;

  即在"if (!ProcessShellCommand(cmdInfo))”在這一句的上方加一句代碼"m_nCmdShow = SW_HIDE;"即可

 (2)VC2010開發的單文檔程序

  • 在InitInstance函數中ParseCommandLine(cmdInfo)語句之后添加語句m_bLoadWindowPlacement=FALSE
  • 在InitInstance函數中m_pMainWnd->ShowWindow(SW_SHOW)語句中的SW_SHOW改為SW_HIDE
  • 在mainframe中還要實現虛函數ActivateFrame,把參數m_nCmdShow置為SW_HIDE;

設置透明窗體

//透明窗體
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0X80000);
HINSTANCE hInst = LoadLibrary("User32.DLL");
if(hInst)
{
    typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
    MYFUNC fun = NULL;
    //取得SetLayeredWindowAttributes函數指針
    fun=(MYFUNC)GetProcAddress(hInst,"SetLayeredWindowAttributes");
    if(fun)
        fun(this->GetSafeHwnd(),0,128,2);
    FreeLibrary(hInst);
}

GetDeviceCaps獲取與修改顯示器屬性

int pixelxperinch = dc.GetDeviceCaps(LOGPIXELSX);//每英寸水平邏輯像素數

int pixelyperinch = dc.GetDeviceCaps(LOGPIXELSY);//每英寸垂直邏輯像素數

int pixelx = dc.GetDeviceCaps(HORZRES);//水平像素總數

int pixely = dc.GetDeviceCaps(VERTRES);//垂直像素總數

int hmm = dc.GetDeviceCaps(HORZSIZE);//水平毫米數

int vmm = dc.GetDeviceCaps(VERTSIZE);//垂直毫米

  以上三者的關系通常滿足:HORZSIZE = 25.4 * HORZRES / LOGPIXELSX

  獲取和設置顯示器屬性的代碼如下所示:

//創建顯示設備上下文
HDC hdc = CreateDC(_T("display"), NULL, NULL, NULL);

//********** 獲取顯示器屬性 **********
//顏色深度
int nBitsPerPixel=GetDeviceCaps(hdc, BITSPIXEL);

//水平分辨率
int nWidth = GetDeviceCaps(hdc, HORZRES);

//垂直分辨率
int nHeight = GetDeviceCaps(hdc, VERTRES);     

//刷新率
int nDisplayFrequency = GetDeviceCaps(hdc, VREFRESH);

 
//********** 設置顯示器屬性 **********
DEVMODE DevMode;

//顏色深度
DevMode.dmBitsPerPel = 16;

//分辨率
DevMode.dmPelsWidth = 800;
DevMode.dmPelsHeight = 600;

//刷新率
DevMode.dmDisplayFrequency = 60;

//設置顯示屬性
LONG nResult = ChangeDisplaySettings(&DevMode, 0);
if (nResult == DISP_CHANGE_SUCCESSFUL) 
{
    //用新的設置參數更新注冊表
    ChangeDisplaySettings(&DevMode, CDS_UPDATEREGISTRY);
    AfxMessageBox(_T("設置顯示屬性成功。"));
}
else 
{
    //恢復默認設置
    ChangeDisplaySettings(NULL, 0);
    AfxMessageBox(_T("設置顯示屬性失敗。"));
}

 
//設置顯示器為省電模式
::SendMessage(m_hWnd, WM_SYSCOMMAND, SC_MONITORPOWER, 1);

//打開顯示器
::SendMessage(m_hWnd, WM_SYSCOMMAND, SC_MONITORPOWER, -1);

//關閉顯示器
::SendMessage(m_hWnd, WM_SYSCOMMAND, SC_MONITORPOWER, 2);

GetSystemMetrics

 1 int i;
 2 i = GetSystemMetrics(SM_CLEANBOOT);//啟動方式 0
 3 i = GetSystemMetrics(SM_CMONITORS);//顯示器數目 1
 4 i = GetSystemMetrics(SM_CMOUSEBUTTONS);//鼠標上按鍵的數目 3
 5 i = GetSystemMetrics(SM_CXBORDER);//窗口邊框的寬度,3D外觀下與SM_CXEDGE值相同 1
 6 i = GetSystemMetrics(SM_CXCURSOR);//光標的寬度 32
 7 i = GetSystemMetrics(SM_CXDLGFRAME);//與SM_CXFIXEDFRAME相同 3
 8 i = GetSystemMetrics(SM_CXDOUBLECLK);//鼠標在某個矩形內連擊兩次被認為是雙擊,該矩形的寬度 4
 9 i = GetSystemMetrics(SM_CXDRAG);//鼠標在某個矩形內單擊移動被認為是拖曳,該矩形的寬度 4
10 i = GetSystemMetrics(SM_CXEDGE);//SM_CXBORDER在3D外觀下的值 2
11 i = GetSystemMetrics(SM_CXFIXEDFRAME);//具有title bar和固定border的窗體的border的寬度 3
12 i = GetSystemMetrics(SM_CXFOCUSBORDER);//DrawFocusRect畫出的矩形的左右邊框的 1
13 i = GetSystemMetrics(SM_CXFRAME);//與SM_CXSIZEFRAME相同 4
14 i = GetSystemMetrics(SM_CXFULLSCREEN);//客戶區(工作區)的寬度 1280
15 i = GetSystemMetrics(SM_CXHSCROLL);//水平滾動條上箭頭位圖的寬度 17
16 i = GetSystemMetrics(SM_CXHTHUMB);//水平滾動條滑塊的寬度 17
17 i = GetSystemMetrics(SM_CXICON);//圖標的默認寬度,LoadIcon只能載入該寬度和SM_CYICON指定高度的icon 32
18 i = GetSystemMetrics(SM_CXICONSPACING);//icon view中各icon的所占矩形的寬度,大於等於SM_CXICON 75
19 i = GetSystemMetrics(SM_CXMAXIMIZED);//最大化頂級窗口的寬度 1288
20 i = GetSystemMetrics(SM_CXMAXTRACK);//一個具有title bar和sizable的窗口所能達到的最大寬度 1292
21 i = GetSystemMetrics(SM_CXMENUCHECK);//菜單上位圖的寬度 13
22 i = GetSystemMetrics(SM_CXMENUSIZE);//菜單條按鈕的寬度,例如多文檔中ChildFrame(最大化時)右上角的關閉按鈕 19
23 i = GetSystemMetrics(SM_CXMIN);//窗體的最小寬度 123
24 i = GetSystemMetrics(SM_CXMINIMIZED);//最小化窗體的寬度 160
25 i = GetSystemMetrics(SM_CXMINSPACING);//各個最小化窗體所占的矩形的寬度,大於等於SM_MINIMIZED 160
26 i = GetSystemMetrics(SM_CXMINTRACK);//窗口能拖拽的最小寬度 123
27 i = GetSystemMetrics(SM_CXSCREEN);//屏幕寬度 1280
28 i = GetSystemMetrics(SM_CXSIZE);//title bar上按鈕的寬度 25
29 i = GetSystemMetrics(SM_CXSIZEFRAME);//sizable窗體的橫向border的寬度 4
30 i = GetSystemMetrics(SM_CXSMICON);//推薦的小圖標(如title bar上的和icon view中的)的寬度 16
31 i = GetSystemMetrics(SM_CXSMSIZE);//caption中圖標的寬度 17
32 i = GetSystemMetrics(SM_CXVIRTUALSCREEN);//virutal screen的寬度 1280
33 i = GetSystemMetrics(SM_CXVSCROLL);//垂直滾動條的寬度 17
34 i = GetSystemMetrics(SM_CYBORDER);// 1
35 i = GetSystemMetrics(SM_CYCAPTION);// 26
36 i = GetSystemMetrics(SM_CYCURSOR);// 32
37 i = GetSystemMetrics(SM_CYDLGFRAME);// 3
38 i = GetSystemMetrics(SM_CYDOUBLECLK);// 4
39 i = GetSystemMetrics(SM_CYDRAG);// 4
40 i = GetSystemMetrics(SM_CYEDGE);// 2
41 i = GetSystemMetrics(SM_CYFIXEDFRAME);// 3
42 i = GetSystemMetrics(SM_CYFOCUSBORDER);// 1
43 i = GetSystemMetrics(SM_CYFRAME);// 4
44 i = GetSystemMetrics(SM_CYFULLSCREEN);// 744
45 i = GetSystemMetrics(SM_CYHSCROLL);// 17
46 i = GetSystemMetrics(SM_CYICON);// 32
47 i = GetSystemMetrics(SM_CYICONSPACING);// 75
48 i = GetSystemMetrics(SM_CYMAXIMIZED);// 778
49 i = GetSystemMetrics(SM_CYMAXTRACK);// 812
50 i = GetSystemMetrics(SM_CYMENU);// 20
51 i = GetSystemMetrics(SM_CYMENUCHECK);// 13
52 i = GetSystemMetrics(SM_CYMIN);// 34=4+4+26
53 i = GetSystemMetrics(SM_CYMINIMIZED);// 31
54 i = GetSystemMetrics(SM_CYMINSPACING);// 31
55 i = GetSystemMetrics(SM_CYMINTRACK);// 34
56 i = GetSystemMetrics(SM_CYSCREEN);// 800
57 i = GetSystemMetrics(SM_CYSIZE);// 25
58 i = GetSystemMetrics(SM_CYSIZEFRAME);// 4
59 i = GetSystemMetrics(SM_CYSMCAPTION);// 18
60 i = GetSystemMetrics(SM_CYSMICON);// 16
61 i = GetSystemMetrics(SM_CYSMSIZE);// 17
62 i = GetSystemMetrics(SM_CYVIRTUALSCREEN);// 800
63 i = GetSystemMetrics(SM_CYVSCROLL);// 17
64 i = GetSystemMetrics(SM_CYVTHUMB);// 17
View Code

MFC坐標轉換

  GetWindowRect是取得窗口在屏幕坐標系下的RECT坐標(包括客戶區和非客戶區),這樣可以得到窗口的大小和相對屏幕左上角(0,0)的位置。

  GetClientRect取得窗口客戶區(不包括非客戶區)在客戶區坐標系下的RECT坐標,可以得到窗口的大小,而不能得到相對屏幕的位置,因為這個矩陣是在客戶區坐標系下(相對於窗口客戶區的左上角)的。  

  ClientToScreen把客戶區坐標系下的RECT坐標轉換為屏幕坐標系下的RECT坐標。

  ScreenToClient把屏幕坐標系下的RECT坐標轉換為客戶區坐標系下的RECT坐標。

  我們對同一個窗口先GetWindowRect取得一個RECT,再用ScreenToClient轉換到客戶坐標系。然后 GetClientRect取得一個RECT,再用ClientToScreen轉換到屏幕坐標系。顯然,GetWindowRect取得的矩陣不小於 GetClientRect取得的矩陣。因為前者包含了非客戶區,而后者包括了客戶區。   

  • 對GetWindowRect取得的矩陣ScreenToClient后,矩陣的大小沒有變小,(-3,-29)是窗口的左上角的坐標,相對窗口客戶區左上角;   
  • 對GetClientRect取得的矩陣ClientToScreen后,矩陣也沒有變大,新得到的矩陣是窗口客戶區在屏幕坐標系上的RECT;

對話框全屏

//刪除WS_CAPTION和WS_BORDER風格
ModifyStyle(WS_CAPTION, 0);
ModifyStyle(WS_BORDER, 0);

//獲得屏幕長度和高度
int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);

//設置對話框位置和大小
SetWindowPos(NULL, 0, 0 , cx, cy, SWP_NOZORDER)

鍵盤消息

(1)組合按鍵

BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)   
{
    if(pMsg->message == WM_KEYDOWN)
    {
        // 組合鍵響應keydown消息
        if( pMsg->wParam == VK_SPACE && (GetKeyState(VK_SHIFT) & 0x8000))
        {
            // 空格 + Shift
        }
    }
}

(2)屏蔽ESC鍵

BOOL CColorDlgDlg::PreTranslateMessage(MSG* pMsg)
{
    //屏蔽ESC關閉窗體/
    if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_ESCAPE ) return TRUE;
    //屏蔽回車關閉窗體,但會導致回車在窗體上失效.
    //if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN && pMsg->wParam) return TRUE;
    else
        return CDialog::PreTranslateMessage(pMsg);
}

(3)屏蔽Alt+F4

BOOL CTestApp::PreTranslateMessage(MSG* pMsg)
{
    // TODO: 在此添加專用代碼和/或調用基類
    if(pMsg->message == WM_SYSKEYDOWN
        && pMsg->wParam == VK_F4)
        return TRUE;

    return CWinAppEx::PreTranslateMessage(pMsg);
}

添加ToolTip提示框

為窗口或其中的控件添加提示框,可以使用MFC的類CToolTipCtrl,使用方法如下:

(1)在窗口的類定義中添加變量說明:

class CTooltipTestDlg : public Cdialog
{
public:
    CToolTipCtrl m_tt;
}

(2)在對話框的OnInitDialog()函數中添加如下代碼:

EnableToolTips(TRUE);
m_tt.Create(this);
m_tt.Activate(TRUE);
CWnd* pW=GetDlgItem(IDC_CHECK1);//得到控件的指針
m_tt.AddTool(pW,L"Check1lakjsfasfdasfd");//為此控件添加tip

(3)重載父窗口的 BOOL PreTranslateMessage(MSG* pMsg) ,在函數中調用 m_tt.RelayEvent(pMsg):

BOOL CTooltipTestDlg::PreTranslateMessage(MSG* pMsg)
{
    // TODO: Add your specialized code here and/or call the base class
    if (NULL != m_tt.GetSafeHwnd())
    {
        m_tt.RelayEvent(pMsg);
    }
    return CDialog::PreTranslateMessage(pMsg);
}

  這樣就完成了為控件添加Tip。

  如果想修改已添加的tip的內容,可以使用UpdateTipText函數,如下

CWnd* pW=GetDlgItem(IDC_CHECK1);//得到已添加tip控件
m_tt.UpdateTipText(L"asdflasdf",pW);//更新tip的內容

  其他控制函數具體可查MSDN的CToolTipCtrl類。

  對於靜態文本框,要把Notify的屬性設為TRUE;而如果靜態文本控件是動態創建的,必須給窗口風格添加SS_NOTIFY,如

m_StaticText.Create(_T("my static"), WS_CHILD|WS_VISIBLE|WS_BORDER|SS_NOTIFY,CRect(10,10,150,50),this);

鼠標經過控件時呈手形

//響應WM_SETCURSOR消息
BOOL CAboutDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
     // TODO: 在此添加消息處理程序代碼和/或調用默認值

     //m_hCursor=AfxGetApp()->LoadCursor(IDC_HAND);
     //文本框IDC_STATIC_HOMEPAGE_LINK的Notify設為true
     if(pWnd==GetDlgItem(IDC_STATIC_HOMEPAGE_LINK))
     {
              SetCursor(LoadCursor(NULL,IDC_HAND));
              return true;//必須加上
     }
     return CDialogEx::OnSetCursor(pWnd, nHitTest, message);
}

Bmp圖片顯示

HBITMAP  hBitmap = (HBITMAP)LoadImage(
    NULL,
    _T(“xxx.bmp”),
    Image_Bitmap,
    0,0,
    Lr_CreateDibSection|Lr_DefaultSize|Lr_LoadFromFile);

PWnd->ModifyStytle(0,SS_BITMAP);
PWnd->SetBitmap(hBitmap);

對話框bmp背景圖片顯示

在對話框的OnEraseBkgnd(CDC *pDC) 函數中添加如下代碼:

HBITMAP  hBitmap = (HBITMAP)Load Image(
    NULL,
    _T(“xxx.bmp”),
    Image_Bitmap,
    0,0,
    Lr_CreateDibSection|Lr_DefaultSize|Lr_LoadFromFile);

CBitmap bitmap;
bitmap.Attach(hBitmap); //關聯位圖對象

BITMAP bmp;
Bitmap.GetBitmap(&bmp); //獲取位圖信息

CDC compatibleDC;
compatibleDC.CreateCompatibleDC(pDC); //內存
compatibleDC. SelectObject(&bitmap); //選取位圖對象

Crect rect;
GetClientRect(&rect);

pDC->StretchBlt(
    rect.left, rect.top, rect.right, rect.bottom,
    &compatibleDC,
    0, 0, bmp.bmWidth, bmp.bmHeight,
    SRCCOPY);

Return true;// 將OnEraseBkgnd(CDC *pDC) 函數中最后的return語句改為本句

解決StretchBlt()壓縮圖片失真

  StretchBlt函數縮放圖片后圖片失真嚴重,所以要用SetStretchBltMode函數來設置 StretchBlt(或StretchDIBits)函數的伸縮模式。具體用法是調用StretchBlt前調用:

SetStretchBltMode(pDC->m_hDC,STRETCH_HALFTONE);

  

GDI+加載透明png圖片

(1)開始加入:

#include <comdef.h>//初始化一下com口

#include "GdiPlus.h"

using namespace Gdiplus;

#pragma comment(lib,"gdiplus.lib")

(2)添加成員變量

ULONG_PTR m_gdiplusToken;

(3)初始化時,啟動GDI+

GdiplusStartupInput gdiplusStartupInput;

GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);

(4)退出時,結束GDI+

GdiplusShutdown(m_gdiplusToken);

(5)在OnPaint或OnDraw函數中,顯示圖片

CClientDC *pDC = new CClientDC(GetDlgItem(IDC_STATIC_PIC));

CRect rect;
GetDlgItem(IDC_STATIC_PIC)->GetWindowRect(&rect);

Image image(_T("1.png")); // Construct an image
//或 Image::FromFile(strPath);

Graphics graphics(pDC->m_hDC); // Create a GDI+ graphics object
graphics.DrawImage(&image, 0, 0, image.GetWidth(), image.GetHeight());

delete pDC;//或ReleaseDC

窗口重繪

  RedrawWindow函數引發重新繪制,使用flags參數控制。

  InvalidateRect直接無效某個區域,指定是否刷新背景。

  如果您的繪制變化較多,有時有閃爍,可以用LockWindowUpdate、UnlockWindowUpdate或者CWnd::SetRedraw控制,最后結束了,允許繪制,再無效待繪制區域Invalidate。

可視動畫控件ActiveMovie

  可視動畫控件ActiveMovie是Microsoft公司開發的ActiveX控件,從開始的1.0版、1.2版到現在的2.0版,功能上已經有了很大的改進。由於該控件內嵌了Microsoft MPEG音頻解碼器和Microsoft MPEG視頻解碼器,所以能夠很好地支持音頻文件和視頻文件,用其播放的VCD效果就很好。另外,播放時若用鼠標右鍵單擊畫面,可以直接對畫面的播放、暫停、停止等進行控制,讀者還可以自行在"屬性"欄中對影片播放進行控制設置,用起來非常方便。當前在Microsoft公司推出的Visual C++6.0中已經包含了ActiveMovie控件的2.0版。

    在Visual C++6.0中,一般情況都是在基於對話框的應用程序中使用ActiveMovie控件,可在菜單中依次選擇"project- >Add To Project- >Components And Controls",在出現的"Components And Controls Gallery"對話框中打開"Registered Active Controls"文件夾,選中"ActiveMovie Control Object"選項,按"Insert"按鈕后關閉該對話框,ActiveMovie控件便出現在程序編輯器的控件面板中。

     可是我按本法操作,卻找不到此控件。

解決辦法:

    打開"開始",運行 regsvr32 msdxm.ocx,有時候會發生注冊失敗的情況,這時必須關掉VS6及相關的音頻播放軟件,才能注冊成功。

MFC operator new: 沒有重載函數接受 3 個參數

  解決辦法:在new前添加全局作用域::

程序打包

  在沒有安裝 VC 的計算機上運行VC程序時要從 VC 中把 mscomm32.ocx、 msvcrt.dll、 mfc42.dll 拷到 Windows 目錄下的 System 子目錄中(win2000 為 System32),對於還沒有注冊的控件,例如自己開發出來的控件,可以借助regsvr32.exe注冊,具體做法是:開始菜單->運行->regsvr32.exe 控件文件名.ocx(或者是控件文件名.dll),注意控件文件名處需要用絕對路徑,例如regsvr32.exe C:/progrm files/myActiveXControl.ocx;你也可以卸載已注冊的控件(也即反注冊),命令格式如下:regsvr32.exe/u 控件文件名.ocx(或者是控件文件名.dll)

  相關鏈接:http://blog.csdn.net/testcs_dn/article/details/26976555


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM