QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3947|回复: 0
打印 上一主题 下一主题

[转帖]VC中的一些常用方法

[复制链接]
字体大小: 正常 放大
god        

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-3-30 22:48 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
一、打开CD-ROM 1 s/ M; \- ^4 J: P; C
mciSendString("Set cdAudio door open wait",NULL,0,NULL); 7 C, i) S2 D2 E, v* u
二、关闭CD_ROM 1 g( T# K6 j' S' ?" N
mciSendString("Set cdAudio door closed wait",NULL,0,NULL); 5 x) z, |2 A' D) u9 }) t
三、关闭计算机 . e. P. G' i0 D- [+ I% S5 \: V9 R
OSVERSIONINFO OsVersionInfo; //包含操作系统版本信息的数据结构
3 M0 c. Y, n% |OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
* Q& `1 o; b8 ?3 V4 v+ W# C1 y) oGetVersionEx(&OsVersionInfo); //获取操作系统版本信息
( `# Y' E0 P# s& E" u. b& X1 Bif(OsVersionInfo.dwPlatformId == VER_PLATform_WIN32_WINDOWS) 7 n/ R- a7 y' d5 D$ `2 b2 L
{
/ ^. V/ t5 }. Q  q# W% c! x. `# l//Windows98,调用ExitWindowsEx()函数重新启动计算机
3 Q/ Q1 u  ]& P0 f- l+ j% ^! p- y1 j0 w. p9 f! R: ]7 V
DWORD dwReserved;
/ l. U, q9 `- q; R+ Y! h2 |- a9 gExitWindowsEx(EWX_REBOOT,dwReserved); //可以改变第一个参数,实现注销用户、
% F, t% B9 R0 q6 z//关机、关闭电源等操作 8 i4 n) E2 O8 o' m+ s" ~" _" f
// 退出前的一些处理程序
, o9 r6 l; Z& s6 T7 D* N) j} : H/ k4 [% e; V  J2 x! p
四、重启计算机
6 ?/ j/ T1 i+ i/ `1 Y9 \/ ^typedef int (CALLBACK *SHUTDOWNDLG)(int); //显示关机对话框函数的指针 . z* B& o$ F% I% b
HINSTANCE hInst = LoadLibrary("shell32.dll"); //装入shell32.dll
9 v; _$ y/ J4 D, p5 j3 j, k3 x6 NSHUTDOWNDLG ShutDownDialog; //指向shell32.dll库中显示关机对话框函数的指针
: h8 w  N1 N5 W; r" {8 Z0 wif(hInst != NULL)
+ m* P1 e3 E0 }% X! G+ _; f! E{ * [" L, Y# B/ i# O9 i, N
//获得函数的地址并调用之
3 N$ X- {4 W) ~9 @ShutDownDialog = (SHUTDOWNDLG)GetProcAddress(hInst,(LPSTR)60);
( `6 ^: B& u/ v1 d+ C1 z. i; e7 f! q/ J
(*ShutDownDialog)(0);
- f  b# v1 X9 h* @9 E! {}
' z5 M- R1 U$ I8 c9 w6 m2 _五、枚举所有字体
5 v' f: s! A+ I; KLOGFONT lf;
) J* E, [! P8 b, K0 {lf.lfCharSet = DEFAULT_CHARSET; // Initialize the LOGFONT structure ' }: W. S- y: q) x
strcpy(lf.lfFaceName,""); 9 w6 z6 y$ m. }. {: s3 l
CClientDC dc (this);   e! h- G+ S+ {- T& v, z( @, @* H
// Enumerate the font families
+ s( q$ P0 i. n1 b+ ^::EnumFontFamiliesEx((HDC) dc,&lf,                                                                                       - A8 p/ c2 G; s- S: A0 a
(FONTENUMPROC) EnumFontFamProc,(LPARAM) this,0);
& \2 q; \! ~* ~1 g; m//枚举函数
6 g" {' j% s* ]' Tint CALLBACK EnumFontFamProc(LPENUMLOGFONT lpelf,
1 S; a. q# x" v4 i) CLPNEWTEXTMETRIC lpntm,DWORD nFontType,long lparam) ) e1 D! N1 V* D6 t$ B& ]

' \3 Q# e5 Y. w3 d6 B{
- f# L% P9 G6 b$ Y0 _// Create a pointer to the dialog window # V' I# M) o6 K4 s. j/ [+ g
CDay7Dlg* pWnd = (CDay7Dlg*) lparam;
. J1 D8 L) C4 A  v, `+ p/ R// add the font name to the list box 1 L/ H. _5 Z* T  i
pWnd ->m_ctlFontList.AddString(lpelf ->elfLogFont.lfFaceName);
& g# U0 H0 D% R9 x: ^$ [// Return 1 to continue font enumeration & t0 _% F* K* v8 W
return 1; $ P8 e' n* r3 C7 [# D% H6 c
}
: I% z( u- W4 x. x0 e1 N. J0 l其中m_ctlFontList是一个列表控件变量
. Q4 Q; P% S6 V六、一次只运行一个程序实例,如果已运行则退出
8 n) h$ a0 d% f* ~4 v' dif( FindWindow(NULL,"程序标题")) exit(0); 0 `  {. U6 h) H1 n, L' B4 @
七、得到当前鼠标所在位置
' v# t- x( l  ]7 |0 sCPoint pt;
  Y0 Z; w* ?4 s! L* i7 ~  E0 J. MGetCursorPos(&pt); //得到位置 " C& j4 g. O1 ~; Y
八、上下文菜单事件触发事件:OnContextMenu事件
9 H1 b& ?/ u$ H$ S+ D$ e' a* C0 c3 @
九、显示和隐藏程序菜单 0 N. M3 ]6 Q! x4 I* ?' ^% E
CWnd *pWnd=AfxGetMainWnd(); " O4 N* M: R: F: q- I/ ^( L
if(b_m) //隐藏菜单 # Q- n' O& ?3 R( S' K
{ " m8 J, O% |5 b  w2 h. R3 F
pWnd->SetMenu(NULL); , x6 t6 J2 I7 D
pWnd->DrawMenuBar(); + C, f* d9 f3 J8 `
b_m=false; 3 L& Q" h) R) |- t
} 7 t- e: F6 g3 C. R: n
else
, t0 n0 |" h* a{
% Q0 L* [2 C% uCMenu menu; 3 q1 r% r% W& o8 c. S; A  a; X
menu.LoadMenu(IDR_MAINFRAME); ////显示菜单 也可改变菜单项
* a# q/ z3 Z1 M0 b' p; LpWnd->SetMenu(&menu); * }; p: d9 H1 Y: u" {. ^6 e
pWnd->DrawMenuBar();
1 u& S$ u6 J4 F* nb_m=true;
0 t7 T8 o4 [8 w/ u, }menu.Detach(); 4 P) k' ^1 b& |% {2 z% i, F/ r
}
1 t, @$ s2 x: R/ @十、获取可执行文件的图标 2 [+ o# \, K5 j% T! I% T
HICON hIcon=::ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0); : z  x" ~& m5 Q' f2 Z) H. s) ~
if (hIcon &&hIcon!=(HICON)-1) 9 c0 X6 }, e$ t- g$ Y. g+ l  z9 r! N
{   n% B7 \. ^4 c7 B8 j
pDC->DrawIcon(10,10,hIcon); $ o2 n7 s; _& }' e% g9 S  h

0 c* Q( b, J2 W' M" F9 n} 6 @7 b, P" x, o  d! }; [
DestroyIcon(hIcon); * L+ B4 z% p; \1 E6 v
十一、窗口自动靠边程序演示
2 \9 k& i( a# ?9 I* p. ^BOOL AdjustPos(CRect* lpRect) + {$ P3 o$ u! @8 y" Y. @
{//自动靠边   C9 n* {4 N# P5 c: \% `
int iSX=GetSystemMetrics(SM_CXFULLSCREEN);
; [1 v1 E: f; _int iSY=GetSystemMetrics(SM_CYFULLSCREEN); 4 I$ G3 n% V' B6 Z8 ^
RECT rWorkArea;
. i" [; u2 `+ [8 IBOOL bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), &rWorkAre & F8 {: z; ~7 T* }3 g
a, 0); ' @6 i" w' M  H
CRect rcWA; & ~4 G9 t1 @) |
if(!bResult)
5 k/ \- g6 c0 [; l& }{//如果调用不成功就利用GetSystemMetrics获取屏幕面积
; D7 ]: d1 J" _2 @; I% T, g  t/ trcWA=CRect(0,0,iSX,iSY); % q" e9 t+ [$ ~1 s# v
}   E) L. i5 _6 F& W0 X" e( V
else ; I# _) w8 F' x; i! r0 I  N
rcWA=rWorkArea;
: l7 B8 E" q) c/ yint iX=lpRect->left; ' w5 r0 U! \! G, y4 ^
int iY=lpRect->top; ) s0 q1 Z5 Q9 H# E' Q

7 H9 Z8 e# C, }0 j* T( U' [4 Jif(iX < rcWA.left + DETASTEP && iX!=rcWA.left) % J6 g! f; v, I$ L, W- K, r
{//调整左 6 l+ m! w( E/ Z" b8 Y$ W
//pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE); + c2 q: Y& t+ k9 M* F: e
lpRect->OffsetRect(rcWA.left-iX,0);
2 X) J% P* x& D0 Z: YAdjustPos(lpRect);
% V; a, Y/ `% g0 {% |) [return TRUE;
9 k* N8 u# a5 U% `! F; O( ^} 3 \, t% S  y2 L; ?' {1 u4 [
if(iY < rcWA.top + DETASTEP && iY!=rcWA.top) 5 k' w  c: ~% b" N4 s" L5 x( h
{//调整上 % ~  q, f+ e4 f- E9 C2 W
//pWnd->SetWindowPos(NULL ,iX,rcWA.top,0,0,SWP_NOSIZE);
; p! k$ X- z1 W  YlpRect->OffsetRect(0,rcWA.top-iY); / U, z, [4 d6 v9 y, X! l% m
AdjustPos(lpRect); # U$ W" i+ u5 j8 ?0 M
return TRUE; 4 ]) u+ l" K$ R8 `& o: h) t
} : B1 ~: m, `" T- w. \/ h3 m
if(iX + lpRect->Width() > rcWA.right - DETASTEP && iX !=rcWA.right-lpRect->W # n1 s% f1 i3 g# r% }( }4 u
4 Z  {6 K# i' S# J6 V0 _
idth())
1 x' R/ [/ a7 J* T/ v8 _9 N{//调整右
. O0 A, g6 t; {//pWnd->SetWindowPos(NULL ,rcWA.right-rcW.Width(),iY,0,0,SWP_NOSIZE);
% T% V9 \* w& flpRect->OffsetRect(rcWA.right-lpRect->right,0);
9 D4 ?: |1 i/ Q1 R: tAdjustPos(lpRect); 7 ^/ u. o6 {* E
return TRUE; % U1 U' t$ G0 r- x  S- z! H
} " w8 Z! [7 c+ V$ m# N1 y
if(iY + lpRect->Height() > rcWA.bottom - DETASTEP && iY !=rcWA.bottom-lpRect
$ @3 I5 q1 G' L1 P# e->Height())
# s% X% U1 P- _5 u( Q5 f{//调整下 2 B8 |1 @/ f' ~
//pWnd->SetWindowPos(NULL ,iX,rcWA.bottom-rcW.Height(),0,0,SWP_NOSIZE); ! R5 P5 c7 [) U0 e# L
lpRect->OffsetRect(0,rcWA.bottom-lpRect->bottom); + |9 S. v) ^9 K  k$ }0 V' O
return TRUE;
& P5 c! y. ?# y+ H3 k% X}
( y' M* e7 o* A. |+ [! |! Nreturn FALSE; ! D$ r: m  d& }) u: `: L$ i6 N7 ~( }
}
7 @" t4 E$ u0 n  D& p5 V//然后在ONMOVEING事件中使用所下过程调用
: V/ \  F: p5 e8 `2 _7 `" H. \$ n% C& u; m0 M/ {5 A
CRect r=*pRect; " s7 R# H. g3 r) r( {1 |
AdjustPos(&r);
" C2 M( b1 [6 _% @2 S*pRect=(RECT)r;
# U3 r8 A$ G- c6 G8 x" k十二、给系统菜单添加一个菜单项 : V  q! |9 p; S8 q, h: k
给系统菜单添加一个菜单项需要进行下述三个步骤:
. a0 D1 u5 A7 h. C9 H  O3 ?首先,使用Resource Symbols对话(在View菜单中选择Resource Symbols...可以显 * f8 _5 g2 |( E1 e- {
示该对话)定义菜单项ID,该ID应大于0x0F而小于0xF000;
: y  ?  k6 \5 F+ F* f8 S其次,调用CWnd::GetSystemMenu获取系统菜单的指针并调用CWnd:: Appendmenu将菜单 . y( g! b+ ^6 C  S4 D( ^
项添加到菜单中。下例给系统菜单添加两个新的 * k, b+ T* r: X' B) J9 v- c
int CMainFrame:: OnCreate (LPCREATESTRUCT lpCreateStruct)
2 v4 ~- u: [7 e& Y' y$ e{
" h4 e5 d1 j0 v# ^4 L3 w5 ^/ h0 q  e
//Make sure system menu item is in the right range.   K& }. C, p) E8 |& b7 f/ U: A9 K

( Y) }- W9 P7 B+ p: D) c  h2 }ASSERT(IDM_MYSYSITEM<0xF000); ; d( k. m% @* }* C5 T) N* b9 \
//Get pointer to system menu. 4 n# F- h) W2 G' M
CMenu* pSysMenu=GetSystemMenu(FALSE); 1 e; R. Y# P& u! ^$ d2 W, N1 P
ASSERT_VALID(pSysMenu);
" W1 z0 e) y) r0 H8 K9 l/ A//Add a separator and our menu item to system menu. 9 d' w# ?2 q- I" v7 ^
CString StrMenuItem(_T ("New menu item"));
# u2 o) n5 g4 ipSysMenu->AppendMenu(MF_SEPARATOR); 0 v# k7 R( B+ v' `+ G) m/ j
pSysMenu->AppendMenu(MF_STRING, IDM_MYSYSITEM, StrMenuItem); 0 P; ^8 l' l+ h

0 |% ]  R) z! d8 M* m* i2 Y}
% x. \6 T: c% I) m6 M& b十三、运行其它程序
3 j/ m$ Z$ _5 _8 [- j//1、运行EMAIL或网址 3 X1 A; [8 K9 S7 x# s# G
char szMailAddress[80]; : R, H5 K# N9 k6 B# O$ ^* T" z. ^! _
strcpy(szMailAddress,"mailtnetvc@21cn.com");
* B! _5 a; t8 O& o6 v$ AShellExecute(NULL, "open", szMailAddress, NULL, NULL, SW_SHOWNORMAL);
- i, |) u& \1 p' ~3 L3 I" C% r" x# n( d. Q
//2、运行可执行程序
2 `# O( W6 n: c4 y7 U# S( r+ z! d4 TWinExec("notepad.exe",SW_SHOW); //运行计事本 & G0 F$ l' S% M( K' v
十四、动态增加或删除菜单 1 A. i4 s! \: O  p0 [7 E! b
1、 增加菜单 $ R. e3 l" h% ^6 D
//添加
' R# m: g; M: x" v& a( fCMenu *mainmenu;
. D: \! U1 s2 A. r  x" ymainmenu=AfxGetMainWnd()->GetMenu(); //得到主菜单 ) v8 r6 P% b7 L- o# G% Z1 h* y
(mainmenu->GetSubMenu (0))->AppendMenu (MF_SEPARATOR);//添加分隔符
- k: A8 `4 q4 a" x! t" N(mainmenu->GetSubMenu (0))->AppendMenu(MF_STRING,ID_APP_ABOUT,_T("Always on
0 s4 h3 F- e, I- [&Top")); //添加新的菜单项
1 Y, g9 |2 J" n" D' SDrawMenuBar(); //重画菜单
0 T2 R. ^5 R6 K/ G# c8 u9 t2、 删除菜单
# W, A9 z: l) C: [! V//删除
6 Z) D/ N; {$ dCMenu *mainmenu;
7 @. r7 {2 M! K& Smainmenu=AfxGetMainWnd()->GetMenu(); //得到主菜单
6 |  V$ H- R9 P/ e8 m  B' B3 C1 ?& p: ^8 f
CString str ; 9 C" |+ G& ]2 p- L3 T1 D, \( o, _* j
for(int i=(mainmenu->GetSubMenu (0))->GetMenuItemCount()-1;i>=0;i--) //取得菜 5 A( t- b" t* o/ N. _$ y, r
单的项数。
/ t- d# H- {3 H- g9 [( b# _{ ( Q8 _. O, `1 a$ ~( D
(mainmenu->GetSubMenu (0))->GetMenuString(i,str,MF_BYPOSITION);
1 ?2 G" k$ e7 i, }. l- v1 [- x//将指定菜单项的标签拷贝到指定的缓冲区。MF_BYPOSITION的解释见上。 ' b) P; h) v4 o7 g1 M4 `; j
if(str=="Always on &Top") //如果是刚才我们增加的菜单项,则删除。
& S6 J5 [$ L) i8 M7 Z% s! j: `! [{ 6 d+ c, c  M8 ^1 l3 Y% g0 Q. {
(mainmenu->GetSubMenu (0))->DeleteMenu(i,MF_BYPOSITION); 2 ~6 t# l3 L$ u( u- ~7 M6 M
break; - A! ]4 a" _& R- B
} ) h0 ~" o( D( M" U6 x1 m8 R
十五、改变应用程序的图标
/ H6 M( N( F, |6 l0 d静态更改: 修改图标资源IDR_MAINFRAME。它有两个图标,一个是16*16的,另一个是3
$ q% a9 w7 P8 P& l" T& U
. I- T: I+ G( I9 R2*32的,注意要一起修改。 " V4 F& r; Y1 L1 I5 U; c7 V: \9 H
动态更改: 向主窗口发送WM_SETICON消息.代码如下: # h0 s) }9 o: M( A* J8 B6 O' c
HICON hIcon=AfxGetApp()->LoadIcon(IDI_ICON);
* s& Q" u* K  V8 a) Z$ G  B6 H' _ASSERT(hIcon);
  b/ C# [5 G; W% lAfxGetMainWnd()->SendMessage(WM_SETICON,TRUE,(LPARAM)hIcon);
+ S9 Z, |8 P2 E) {# ~# D& S: z十六、另一种改变窗口标题的方法
" E4 g6 [' ^/ h' S使用语句 CWnd* m_pCWnd = AfxGetMainWnd( ),然后,再以如下形式调用SetWindowTe
$ V  Y; E( ~; K+ F7 [1 `4 oxt()函数: 0 y: x. w0 k- I: O* L' x8 T( v# O
SetWindowText( *m_pCWnd,(LPCTSTR)m_WindowText);// m_WindowText可以是一个CSt 7 N4 B7 ]9 j4 i( Y
ring类的变量。 # T% g" ^2 R. a+ R
十七、剪切板上通过增强元文件拷贝图像数据 6 _. J" }# W5 S  X
下面代码拷贝通过元文件拷贝图像数据到任何应用程序,其可以放置在CView派生类的函 5 l8 g( g% z% n  T5 c- N
3 t8 v/ y5 R2 f7 T6 }- Y
数中。 ) ]+ q9 M3 ~5 h" N
CMetaFileDC * m_pMetaDC = new CMetaFileDC(); % a8 a# G6 W3 v' f
m_pMetaDC->CreateEnhanced(GetDC(),NULL,NULL,"whatever"); ; }8 Q- B' ^9 f3 S( ?
//draw meta file 6 g- P! j0 X( |% [  e# l0 |
//do what ever you want to d bitmaps, lines, text... % \  W9 b( @7 ~6 t
//close meta file dc and prepare for clipboard; 8 S. H9 b4 r% Z& }5 }- b3 C; P0 D
HENHMETAFILE hMF = m_pMetaDC->CloseEnhanced(); % a3 E' Q: _8 U4 }' \
//copy to clipboard
, G. x3 F# @  |1 J, v7 U: kOpenClipboard(); " t: |* n. c6 O1 S% ?# v
EmptyClipboard();
3 n: n/ M7 x# Y: r" s7 D" S::SetClipboardData(CF_ENHMETAFILE,hMF);                                                                                 
; I" z7 l2 f) w" T' u9 m$ ~CloseClipboard(); / {4 c) S& B* b- H
) H, _, y6 p. S) f/ q
//DeleteMetaFile(hMF);
, x, A+ Z+ {/ W. k1 L  ]delete m_pMetaDC;
- g/ ~& z& u$ P3 R* ~+ g7 o: B十八、剪切板上文本数据的传送
* c) ~3 G) ^8 B: X1 {把文本放置到剪接板上:
( L5 p4 N" u  H. J- K6 b! VCString source; 6 P# ~* e  }* d+ l
//put your text in source ( j, s1 @* Z/ s/ X5 @0 B! S# m
if(OpenClipboard())
6 v3 x; f- |! c+ N, c$ @{
* S# Y9 C; J& b0 L, R: u2 c7 gHGLOBAL clipbuffer; " ^! K3 p+ M$ o6 P6 T8 k6 C: P) u
char * buffer;
" v, R3 C# v% L/ @' y) |' P$ WEmptyClipboard(); * J" T6 h0 n3 `; w# N/ [1 i, P
clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1); ) t. Y5 L( h8 C. \. m$ E
buffer = (char*)GlobalLock(clipbuffer);
5 {* C2 ?, Z- N6 ^; _strcpy(buffer, LPCSTR(source));
& [' c+ e6 C- i: R- w% OGlobalUnlock(clipbuffer); 4 ^, V) o8 j  R' ~0 F% `& @
SetClipboardData(CF_TEXT,clipbuffer); 4 [$ x, x5 B9 C- W' K" q; c
CloseClipboard();
  |5 }* r. }% T1 q" K}
- p1 |  ?1 U4 Q8 f( {% |从剪接板上获取文本: 3 D1 s* r5 `  J$ ~, B! f
% r5 q/ F) F/ I  F
char * buffer;
# U+ e" ]' R8 }$ q  A) Cif(OpenClipboard()) " T1 A" q! K: m$ U: X
{ % l4 q2 r6 j# q& L+ `. \$ g2 B
buffer = (char*)GetClipboardData(CF_TEXT); ' @8 l  F8 z8 v; G  H) _
//do something with buffer here & f2 @; L* g% L
//before it goes out of scope
0 [: ^9 D5 L: ^7 T}
" E4 ^; |1 P: @5 o% a) DCloseClipboard();
8 g8 C, k6 b( k9 H  y9 h十九、将捕捉屏幕图像到剪切版中
5 d! s' M+ J; ?1 z3 B9 P3 H# Uvoid CShowBmpInDlgDlg::OnCutScreen()
5 S* ^& d5 ^6 {$ B1 h+ T; x{
7 K$ n2 y: O9 G# aShowWindow(SW_HIDE); + p' F0 W9 f0 T6 d0 {& i4 z7 O9 b
RECT r_bmp={0,0,::GetSystemMetrics(SM_CXSCREEN),
0 M* W' y! n4 S9 S+ ?. r: A8 O::GetSystemMetrics(SM_CYSCREEN)};                                                                                       - {* g6 K/ s6 |
HBITMAP hBitmap;
+ _* k( E  U5 A3 @7 D  ^, A! }9 ohBitmap=CopyScreenToBitmap(&r_bmp);
' [+ B6 Y! M% i/ R7 r4 O- I5 X8 ]" g
//hWnd为程序窗口句柄
- m% G. }; G3 P6 v: D' xif (OpenClipboard())
/ g0 T" }& c7 ~0 b- V1 K{
7 L' P9 n% w1 X* @7 q- W/ y  G$ y6 OEmptyClipboard(); / C. T, V9 a( N2 z; q+ c
SetClipboardData(CF_BITMAP, hBitmap);
1 X" W# Y) }; X$ C- `5 J% {6 G+ y2 ^CloseClipboard(); + n. I/ I9 b- i& e
}
1 ^' Z1 t' K' q. O3 ~1 [ShowWindow(SW_SHOW); ( ~& d3 T# C( r5 B9 N
} * x/ M6 b1 J7 }+ r
HBITMAP CShowBmpInDlgDlg::CopyScreenToBitmap(LPRECT lpRect)
; E2 ~8 f1 U& o: Q7 Y2 D* M! z* W( i{
3 w& ~4 U5 P3 [# y8 \) Z8 K' n0 ?! k//lpRect 代表选定区域
8 E' t5 s. b; q9 y{
/ R9 J' z! a- iHDC hScrDC, hMemDC; 8 l- ?3 Y6 P, j4 \: n; L+ }
// 屏幕和内存设备描述表
/ L* _2 p, Y+ m$ L" o; H" IHBITMAP hBitmap, hOldBitmap; + T7 l% \6 F3 J' {; D# m! `
// 位图句柄 , ~! D  Y) ^' \$ ~8 f: c
int nX, nY, nX2, nY2; ) u. z; L& l4 [. F  O- t% s
// 选定区域坐标
4 D0 [) o9 z& yint nWidth, nHeight; 8 Q5 z5 [% ~- ^/ S8 \3 D
// 位图宽度和高度 ) R  Q3 W; w9 b, k
int xScrn, yScrn;
3 z/ ]3 c" F- Z3 }// 屏幕分辨率
# _) j, s$ R& U- q" l
- C' q! U) C  C- ?// 确保选定区域不为空矩形 0 l# F% _7 M8 t% ^3 K, N+ W2 y
if (IsRectEmpty(lpRect)) : a) D% W3 G$ V$ q' M! A
return NULL; 3 ]- b7 n: }1 I$ A3 G
//为屏幕创建设备描述表
- v) W7 X4 V! c. DhScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
) b7 ~/ v& }5 U* _//为屏幕设备描述表创建兼容的内存设备描述表 . d' l4 n/ P" G1 e1 x8 j0 ~
hMemDC = CreateCompatibleDC(hScrDC); 2 A% q- V& b; ]0 G
// 获得选定区域坐标 ! ^8 x! N+ \! J' o* ?
nX = lpRect->left; 3 x3 m/ H* t/ U0 z0 C; K3 [9 A; i6 n
nY = lpRect->top;
- w/ l% C5 D. k3 g$ o4 s. wnX2 = lpRect->right; ( M8 ^% z  x0 e- j9 u
nY2 = lpRect->bottom; ! ?: O- ]# H; b9 {0 I; I1 y4 q
// 获得屏幕分辨率 9 {0 T  j( v7 w0 _  @
xScrn = GetDeviceCaps(hScrDC, HORZRES); * ?  ~- H2 K8 j1 b4 |  m% O- A
yScrn = GetDeviceCaps(hScrDC, VERTRES);
$ U5 t  M; B/ W//确保选定区域是可见的
% _6 U, P" T( {6 n6 Nif (nX<0)
, B" g7 s/ G6 Z( ~! t
2 X; p* ]$ O4 |6 ?nX = 0;
3 K" D  @2 I5 f3 U* u0 ^if (nY<0) / v) N/ Z$ U1 V  b  Z5 p) D4 D
nY = 0; : f/ O* q2 j# a! x/ @- h
if (nX2>xScrn)
8 {% y! h* Y+ `; y# nnX2 = xScrn;
; ?' s' \+ y  ?( b$ h. O/ E) hif (nY2>yScrn) " e  U4 D' n* D) f
nY2 = yScrn;
& a( W$ F$ f5 ^nWidth = nX2 - nX;
: T- y. w- M' |1 @: W4 `nHeight = nY2 - nY;
* ~: l& T. C0 Q+ n$ {( j. g// 创建一个与屏幕设备描述表兼容的位图
- G3 E/ g- @3 V$ O0 x2 f6 ThBitmap = CreateCompatibleBitmap
1 k9 R- G- u; i1 w' Z  b) Z. G(hScrDC, nWidth, nHeight);
! Q. k" a; d6 T5 T; [+ M// 把新位图选到内存设备描述表中
) b0 w' T# m7 w; x: mhOldBitmap =(HBITMAP)SelectObject(hMemDC, hBitmap); 2 C& T+ \! f! s
// 把屏幕设备描述表拷贝到内存设备描述表中 " G: R8 t7 X3 }8 P2 Z( q% r5 D$ q
BitBlt(hMemDC, 0, 0, nWidth, nHeight,
; P( K) @) _3 }( r; _) }& @* s: |5 UhScrDC, nX, nY, SRCCOPY);
' M: h. g9 M6 O4 n3 R1 C//得到屏幕位图的句柄 6 x0 \2 F. N( A
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
' g5 O& _* |! J; g8 F) Z; X' [; m8 P% C! c; q* b
//清除 6 \1 E' {. e2 a0 g9 r2 k2 ^
DeleteDC(hScrDC);
& ^  D( g. u+ D1 u' fDeleteDC(hMemDC); , Q$ V% a% b7 y% u
// 返回位图句柄 . h6 y. s  B4 k
return hBitmap; ' b5 [; n. N7 v! c- j
} " _! T/ g* {5 D
}
6 |: j% n6 |1 B二十、如何将位图缩放显示在Static控件中 4 M& ~- @7 w: @  @: _$ k
//在Staic控件内显示位图 9 M, D( ^$ y9 T: Q6 r
void CShowBmpInDlgDlg::ShowBmpInStaic() ! x6 `6 Q: H4 Q/ ]. _! k
{
0 M* A0 s9 E" L( c. ECBitmap hbmp;
1 W# K& y) T5 n1 `3 N) dHBITMAP hbitmap;
* }$ u1 s) d' w( E' y3 g" v5 }" ?//将pStatic指向要显示的地方 & j4 q3 u, r- p2 c
CStatic *pStaic; 2 W. x+ T- D3 D) Y* ~$ r  \
pStaic=(CStatic*)GetDlgItem(IDC_IMAGE); * D; Y6 A; h4 n, J2 _5 V
//装载资源 MM.bmp是我的一个文件名,用你的替换
5 ]# I6 X! K0 y3 b% {hbitmap=(HBITMAP):oadImage (::AfxGetInstanceHandle(),"MM.bmp",
  E& y- ]7 }# U, X1 \IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); $ H* b: H; Y- R: }2 D
" @/ ^0 y& N" U8 r0 g4 \- r! S" Z
hbmp.Attach(hbitmap);
2 a3 M# w0 r% T; F' {8 X: ]//获取图片格式 ' V  w$ l  U- d: C, l
BITMAP bm;
4 ~( z& h( k1 N, B5 _. ]8 rhbmp.GetBitmap(&bm); % k3 M- D) N4 {9 o6 ^8 i
CDC dcMem; , Y* H" @* X5 p  J+ j
dcMem.CreateCompatibleDC(GetDC());
' z( `! C. m3 R$ iCBitmap *poldBitmap=(CBitmap*)dcMem.SelectObject(hbmp);
" V& G# x" h  {3 `& b  `8 a+ rCRect lRect;
7 ]/ s" J% s: g, ]) `* n4 h. O3 opStaic->GetClientRect(&lRect); . P9 S8 D  L  Z
//显示位图
( C! d8 G9 L) s4 NpStaic->GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Heigh 0 [* y# d2 ~9 i2 Q' n- G
t(), % n8 B; \; }; P. X: a4 `4 G
&dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY); - U# v# t7 g1 \# `% `, m5 L
dcMem.SelectObject(&poldBitmap);
9 w, O6 t1 e2 p4 n) Y/ }2 c8 o}
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
如果我没给你翅膀,你要学会用理想去飞翔!!!
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-9-1 22:12 , Processed in 0.460491 second(s), 52 queries .

回顶部