锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鍓嶈█ 浠g爜 涓鏃︾敤榧犳爣宸﹂敭鍦ㄧ獥鍙e唴鐐瑰嚮騫朵笖涓嶉噴鏀撅紝榧犳爣鐨勬寚閽堝皢鍙樹負媯掑艦錛屽茍涓旇紿楀彛鐨勪俊鎭皢鏄劇ず鍦╓inTrans紿楀彛涓娿?褰撻紶鏍囧乏閿閲婃斁鍚庯紝浜嬩歡WM_LBUTTONUP澶勭悊鍑芥暟灝辮璋冪敤銆?
瀹忎腑"#"鍜?/span>"##"鐨勭敤娉?/span> 涓銆佷竴鑸敤娉?/span> 鎴戜滑浣跨敤#鎶婂畯鍙傛暟鍙樹負涓涓瓧絎︿覆,鐢?/span>##鎶婁袱涓畯鍙傛暟璐村悎鍦ㄤ竴璧?/span>. 鐢ㄦ硶: #include #include using namespace std; #define STR(s) #s #define CONS(a,b) int(a##e##b) int main() { printf(STR(vck)); // 杈撳嚭瀛楃涓?/span>"vck" printf("%d\n", CONS(2,3)); // 2e3 杈撳嚭:2000 return 0; } 浜屻佸綋瀹忓弬鏁版槸鍙︿竴涓畯鐨勬椂鍊?/span> 闇瑕佹敞鎰忕殑鏄嚒瀹忓畾涔夐噷鏈夌敤'#'鎴?/span>'##'鐨勫湴鏂瑰畯鍙傛暟鏄笉浼氬啀灞曞紑. 1, 闈?/span>'#'鍜?/span>'##'鐨勬儏鍐?/span> #define TOW (2) #define MUL(a,b) (a*b) printf("%d*%d=%d\n", TOW, TOW, MUL(TOW,TOW)); 榪欒鐨勫畯浼氳灞曞紑涓猴細 printf("%d*%d=%d\n", (2), (2), ((2)*(2))); MUL閲岀殑鍙傛暟TOW浼氳灞曞紑涓?/span>(2). 2, 褰撴湁'#'鎴?/span>'##'鐨勬椂鍊?/span> #define A (2) #define STR(s) #s #define CONS(a,b) int(a##e##b) printf("int max: %s\n", STR(INT_MAX)); // INT_MAX #include 榪欒浼氳灞曞紑涓猴細 printf("int max: %s\n", "INT_MAX"); printf("%s\n", CONS(A, A)); // compile error 榪欎竴琛屽垯鏄細 printf("%s\n", int(AeA)); A涓嶄細鍐嶈灞曞紑, 鐒惰岃В鍐寵繖涓棶棰樼殑鏂規硶寰堢畝鍗?/span>. 鍔犲涓灞備腑闂磋漿鎹㈠畯. 鍔犺繖灞傚畯鐨勭敤鎰忔槸鎶婃墍鏈夊畯鐨勫弬鏁板湪榪欏眰閲屽叏閮ㄥ睍寮, 閭d箞鍦ㄨ漿鎹㈠畯閲岀殑閭d竴涓畯(_STR)灝辮兘寰楀埌姝g‘鐨勫畯鍙傛暟. #define A (2) #define _STR(s) #s #define STR(s) _STR(s) // 杞崲瀹?/span> #define _CONS(a,b) int(a##e##b) #define CONS(a,b) _CONS(a,b) // 杞崲瀹?/span> printf("int max: %s\n", STR(INT_MAX)); // INT_MAX,int鍨嬬殑鏈澶у鹼紝涓轟竴涓彉閲?/span> #include 杈撳嚭涓?/span>: int max: 0x7fffffff STR(INT_MAX) --> _STR(0x7fffffff) 鐒跺悗鍐嶈漿鎹㈡垚瀛楃涓詫紱 printf("%d\n", CONS(A, A)); 杈撳嚭涓猴細200 CONS(A, A) --> _CONS((2), (2)) --> int((2)e(2)) 涓夈?/span>'#'鍜?/span>'##'鐨勪竴浜涘簲鐢ㄧ壒渚?/span> 1銆佸悎騫跺尶鍚嶅彉閲忓悕 #define ___ANONYMOUS1(type, var, line) type var##line #define __ANONYMOUS0(type, line) ___ANONYMOUS1(type, _anonymous, line) #define ANONYMOUS(type) __ANONYMOUS0(type, __LINE__) 渚嬶細ANONYMOUS(static int); 鍗?/span>: static int _anonymous70; 70琛ㄧず璇ヨ琛屽彿錛?/span> 絎竴灞傦細ANONYMOUS(static int); --> __ANONYMOUS0(static int, __LINE__); 絎簩灞傦細 --> ___ANONYMOUS1(static int, _anonymous, 70); 絎笁灞傦細 --> static int _anonymous70; 鍗蟲瘡嬈″彧鑳借В寮褰撳墠灞傜殑瀹忥紝鎵浠?/span>__LINE__鍦ㄧ浜屽眰鎵嶈兘琚В寮錛?/span> 2銆佸~鍏呯粨鏋?/span> #define FILL(a) {a, #a} enum IDD{OPEN, CLOSE}; typedef struct MSG{ IDD id; const char * msg; }MSG; MSG _msg[] = {FILL(OPEN), FILL(CLOSE)}; 鐩稿綋浜庯細 MSG _msg[] = {{OPEN, "OPEN"}, {CLOSE, "CLOSE"}}; 3銆佽褰曟枃浠跺悕 #define _GET_FILE_NAME(f) #f #define GET_FILE_NAME(f) _GET_FILE_NAME(f) static char FILE_NAME[] = GET_FILE_NAME(__FILE__); 4銆佸緱鍒頒竴涓暟鍊肩被鍨嬫墍瀵瑰簲鐨勫瓧絎︿覆緙撳啿澶у皬 #define _TYPE_BUF_SIZE(type) sizeof #type #define TYPE_BUF_SIZE(type) _TYPE_BUF_SIZE(type) char buf[TYPE_BUF_SIZE(INT_MAX)]; --> char buf[_TYPE_BUF_SIZE(0x7fffffff)]; --> char buf[sizeof "0x7fffffff"]; 榪欓噷鐩稿綋浜庯細 char buf[11];
2 struct impl;
3
4 class CPimplSample
5 {
6 public:
7 CPimplSample();
8 ~CPimplSamle();
9 void DoSomething();
10 private:
11 impl* m_pImpl;
12
13 }
2 include "PimplSample.h"
3 include <string>
4 include <iostream>
5
6 struct impl{
7 void DoAnthorThing(){
8 std:cout << s << "\n";
9 }
10 std::string s;
11 }
12
13 CPimplSample::CPimplSample():m_pImpl(new imple(){
14 m_pImpl->s = "Hello Impl";
15 }
16
17 CPimplSample::~CPimplSample(){
18 delete m_pImpl;
19 }
20
21 CPimplSample::DoSomething(){
22 m_pImpl->DoAnthorThing();
23 }
榪欐牱鎶婅闅愯棌鐨勫睘鎬у拰鎺ュ彛閮藉啓鍦╟pp鏂囦歡涓婂氨鍙互涓嶅闇插埌澶存枃浠朵笂浜嗭紝璁板緱鏋愭瀯鍑芥暟鎶奿mpl鎸囬拡鏂芥斁鍝?br>
]]>
]]>
]]>
]]>
鏈枃紺轟緥宸ョ▼
寰堝鏂囩珷紺鴻寖浜嗕嬌鐢╓indows 2000/XP鐨勫眰嬈$壒鎬ф潵瀹炵幇紿楀彛鐨勯忔槑鍖栥傛湰鏂囧彲浠ラ氳繃璇ョ壒鎬т嬌浠繪剰紿楀彛閫忔槑鍖栵紝鍗充嬌浣犳病鏈夎紼嬪簭鐨勬簮浠g爜銆?
浣跨敤 "WinTrans" 紼嬪簭浣犲彲浠ラ夋嫨浠繪剰姝e湪榪愯鐨勭▼搴忥紝鐢ㄩ紶鏍囧乏閿嫋鎷藉乏涓婅妗嗗唴鐨勬騫跺皢瀹冨帇鍦ㄨ紼嬪簭鐨勬爣棰樻爮涓婏紝鐒跺悗鏀懼紑錛屽垯璇ョ▼搴忓氨鍙互鍙樻垚閫忔槑銆備綘鍙互璋冩暣婊戝姩鏉$殑浣嶇疆鏉ユ帶鍒墮忔槑搴︺?WinTrans"
鏈変竴涓潪甯歌薄 SPY 鐨勭晫闈紝榪樺彲浠ョず鑼僕in32 APIs鐨勫涓嬬敤娉曪細鐢ㄩ紶鏍囨寚閽堝畾浣嶇獥鍙o紝鑾峰彇渚嬪綾誨悕銆佹爣棰樼瓑紿楀彛淇℃伅銆?br>
鐢ㄦ硶
鍦╓indows 2000/XP涓紝User32.dll澧炲姞浜嗕竴涓柊鍑芥暟SetLayeredWindowAttributes銆傝浣跨敤璇ュ嚱鏁幫紝鎴戜滑蹇呴』鍦ㄧ敓鎴愮獥鍙f垨浣跨敤SetWindowLong鍑芥暟涓緗獥鍙i鏍糤S_EX_LAYERED
(0x00080000)銆傝椋庢牸涓鏃﹁璁劇疆錛屾垜浠氨鍙互璋冪敤璇ュ嚱鏁版潵閫忔槑鍖栫獥鍙c傝鍑芥暟鎵闇鍙傛暟濡備笅錛?
棣栧厛瀹氫箟瀵硅瘽妗嗙殑鎴愬憳鍙橀噺錛圵inTransDlg.h錛夈?bool m_bTracking; // 褰撻紶鏍囪鎹曟崏鏃惰緗負TRUE
鍚屾椂瀹氫箟涓涓寚鍚慡etLayeredWindowAttributes鍑芥暟鐨勬寚閽堛傝鍑芥暟鍦║ser32.dll涓畾涔夈?
HWND m_hCurrWnd; // 榧犳爣鎵鍦ㄧ獥鍙g殑鍙ユ焺
HCURSOR m_hCursor; // 媯掑瀷鍏夋爣鍙ユ焺// 鍏ㄥ眬鍙橀噺
鍦∣nInitDialog浜嬩歡涓幏鍙朣etLayeredWindowAttributes鍑芥暟鐨勬寚閽堝茍涓斾繚瀛樺湪鍏ㄥ眬鍙橀噺g_pSetLayeredWindowAttributes涓?
typedef BOOL (WINAPI *lpfn) (HWND hWnd, COLORREF cr,
BYTE bAlpha, DWORD dwFlags);
lpfn g_pSetLayeredWindowAttributes;BOOL CWinTransDlg::OnInitDialog()
鐒跺悗瀹氫箟浜嬩歡 WM_LBUTTONDOWN, WM_LBUTTONUP 鍜?WM_MOUSEMOVE 鐨勮Е鍙戝嚱鏁? M_LBUTTONDOWN 浜嬩歡浠g爜濡備笅錛?
{
....
// 鑾峰彇鍑芥暟 SetLayeredWindowAttributes 鍦║ser32.dll涓殑鎸囬拡
HMODULE hUser32 = GetModuleHandle(_T("USER32.DLL"));
g_pSetLayeredWindowAttributes = (lpfn)GetProcAddress(hUser32,
"SetLayeredWindowAttributes");
if (g_pSetLayeredWindowAttributes == NULL)
AfxMessageBox (
"Layering is not supported in this version of Windows",
MB_ICONEXCLAMATION);
// 瑁呭叆媯掑艦鍏夋爣
HINSTANCE hInstResource = AfxFindResourceHandle(
MAKEINTRESOURCE(IDC_WAND), RT_GROUP_CURSOR);
m_hCursor = ::LoadCursor( hInstResource, MAKEINTRESOURCE(IDC_WAND) );
...
}void CWinTransDlg::OnLButtonDown(UINT nFlags, CPoint point)
WM_MOUSEMOVE浜嬩歡澶勭悊鍑芥暟錛?
{
...
SetCapture(); //榧犳爣鎹曡幏璁劇疆鍒版寚瀹氱殑紿楀彛銆傚湪榧犳爣鎸夐挳鎸変笅鐨勬椂鍊欙紝榪欎釜紿楀彛浼氫負//褰撳墠搴旂敤紼嬪簭鎴栨暣涓郴緇熸帴鏀舵墍鏈夐紶鏍囪緭鍏?br> m_hCurrWnd = NULL; //鐜板湪榪樻病鏈夌獥鍙i忔槑
m_bTracking = true; // 璁劇疆track鏍囧織
::SetCursor(m_hCursor); // 灝嗗厜鏍囨敼涓烘褰?
}void CWinTransDlg::OnMouseMove(UINT nFlags, CPoint point)
{
...
if (m_bTracking)
{
...
// 鑾峰彇榧犳爣浣嶇疆
ClientToScreen(&point);
...
// 鑾峰彇榧犳爣涓嬮潰鎵鍦ㄧ殑紿楀彛鍙ユ焺
m_hCurrWnd = ::WindowFromPoint(point);
...
// 鏄劇ず璇ョ獥鍙g殑綾匯佹爣棰樼瓑淇℃伅…
...
}
...
}void CWinTransDlg::OnLButtonUp(UINT nFlags, CPoint point)
鍘熸枃浣滆咃細abhinaba錛屽啀姝よ〃紺烘劅璋紒
{
...
//閲婃斁榧犳爣鎹曡幏
ReleaseCapture();
m_bTracking = false;
//濡傛灉榧犳爣涓嬮潰鐨勭獥鍙d笉鏄湰紼嬪簭WinTrans錛屾垜浠氨瑕佽緗眰嬈℃牱寮忓茍涓旈氳繃璁劇疆婊戝姩鏉℃潵瀹炵幇閫忔槑鍖栥?br>
if (g_pSetLayeredWindowAttributes && m_hCurrWnd != m_hWnd)
{
::SetWindowLong(m_hCurrWnd, GWL_EXSTYLE,
GetWindowLong(m_hCurrWnd,
GWL_EXSTYLE) ^ WS_EX_LAYERED);
g_pSetLayeredWindowAttributes(m_hCurrWnd, 0,
(BYTE)m_slider.GetPos(), LWA_ALPHA);
::RedrawWindow(m_hCurrWnd, NULL, NULL,
RDW_ERASE | RDW_INVALIDATE |
RDW_FRAME | RDW_ALLCHILDREN);
}
...
}
]]>
]]>
{
CBitmap bitmap ;
bitmap.Attach(hBitmap) ;
BITMAP bitmapInfo ;
bitmap.GetBitmap(&bitmapInfo) ;
int nRow = bitmapInfo.bmHeight ;
int nCol = bitmapInfo.bmWidth ;
CDC memDC ;
memDC.CreateCompatibleDC(NULL) ;
CBitmap* pOldBitmap = memDC.SelectObject(&bitmap) ;
CRgn rgn ;
rgn.CreateRectRgn(0,0,nCol,nRow) ;
for(int y = 0; y < nRow; y++)
{
for(int x = 0; x < nCol; x++)
{
COLORREF clrPixel = memDC.GetPixel(y,x) ;
if(clrPixel == clrKey)//鍘婚櫎鍏抽敭鑹?
{
CRgn rgnTemp ;
rgnTemp.CreateRectRgn(y,x,y+1,x+1) ;
rgn.CombineRgn(pRgn,&rgnTemp,RGN_XOR) ;
rgnTemp.DeleteObject() ;
}
}
}
memDC.SelectObject(pOldBitmap) ;
memDC.DeleteDC() ;
bitmap.Detach() ;
(HRGN)return rgn.Detach() ;
}
鏍規嵁鐢熸垚鐨勫尯鍩熻緗獥鍙?
void SetWndRgn(HWND hWnd,HBITMAP hBitmap)
{
HRGN hRgn = SetRgn(hBitmap,clrKey)//鍏朵腑clrKey涓鴻mask鎺夌殑棰滆壊鍊?
SetWindowRgn(hRgn) ;
return ;
}
緗戜笂鎵懼埌1涓唬鐮佷緥瀛?涓嬭澆
鍙﹀1涓柟娉曟槸鐢?SetLayeredWindowAttributes 渚嬪瓙 涓嬭澆
]]>
com瀵硅薄鏄竴涓被,瀹冪戶鎵挎帴鍙?鎺ュ彛涓殑virtual 鎴愬憳鍑芥暟鍦╟om瀵硅薄涓疄鐜?綾葷殑涓涓疄渚嬪氨鏄竴涓猚om瀵硅薄.
榪欎竴鍙ヨ兘鎻忚堪鎺ュ彛鎸囬拡鐨勫姛鑳姐傘傘傚厛淇濆瓨錛岃繜涓嬭ˉ鍥炰緥瀛?
]]>