VC雕虫小技集(1-7)

来源:互联网 发布:搜索引擎优化期末考试 编辑:程序博客网 时间:2024/05/22 01:36

VC雕虫小技集(一)

避免随机数相同,可以取当前时间,读文件,读任意内存(如未定义变量,有一定危险).

       CTime t = CTime::GetCurrentTime();

       int n = t.GetMinute() * 60 + t.GetSecond();

       while(n-- > 0)

       {

              rand();

       }

       const int N = 100;

       int result = rand()%N;

 

 

2, 字符串与数的转换

sprintf,sscanf,其实还有其它许多函数,但只这两个函数是最容易记住的.因为它们和printf,scanf,fprint,fscanf的用法类似.

       char str[100];

       int    x = 5;

       sprintf(str,"%d",x);

       sscanf("10","%x",&x);

 

 

3,看一个键是否处于按下状态以及是否被按下过.

SHORT key = GetAsyncKeyState(VK_F11);

0x8001处于被按下状态

1两次调用GetAsyncKeyState(VK_F11);之间,f11被按下过.

GetAsyncKeyState,GetKeyState指定虚拟码为VK_LBUTTON,VK_RBUTTON就可判断鼠标是否被按下过 

 

4,如何删除一个类.

方法一:

1,把文件删除.

2,再打开类向导(Ctrl+W)类向导找不到文件,会弹出一个对话框ReMove就行了.

方法二:

1,FileView中删除.
2,物理删除.

 

 

 

5,自定义的类没了:

project->Add to project ->files

 

6,使用PI

include math.h

#define _USE_MATH_DEFINES 

#include "math.h"

M_PI 就是pi了

 

7,请问怎样可以获得分区的卷标??

char buf[MAX_PATH];

GetVolumeInformation("c://", buf, MAX_PATH, NULL, NULL, NULL, NULL, NULL);

AfxMessageBox(buf);

 

8,打开一个网页

ShellExecute(::GetDesktopWindow(),_T("open"),//SK modified for Unicode

              _T("http://www.sohu.com"),NULL,NULL,//SK modified for Unicode

              SW_MAXIMIZE);

 

9,关闭时,弹出对话框让用户确认

void CMainFrame::OnClose() 

{

       if(IDOK != MessageBox("你要退出吗?点确定退出","你要退出吗?",MB_OKCANCEL))

              return  ;

       CFrameWnd::OnClose();

}  

 

10,菜单小问题

ID_FILE_OPEN

在资源Accelerator中为:

ID                        Key

ID_FILE_OPEN              Ctrl+O

表示在程序中按ctrl+o组合键激活打开菜单(如果文件菜单打开了,就无效).

在资源Menu中为:

ID_FILE_OPEN的标题为打开(&O).../tCtrl+O

&O表示当它的父菜单(文件菜单)被打开后,O激活文件菜单.

 

11,Sizeof有问题??

class B

  {

    bool a;

    bool c;

    int b;

  }; // sizeof (B) == 8

    布局:

  1    2    3    4

  bool bool 填充 填充

  1    2    3    4

  int ...............

  一目了然.:)

  这个时候编译器只在c后插入两个填充字节,因为b占四个字节,所以自动的以一个字的二进制来填充. 

 这是编译器的对齐问题,只要在前面加入

#pragma 1

使得按一个byte对齐就可以了.

VC雕虫小技集(二)

2007年02月08日 星期四 14:45

何志丹

1,如果你没有定义_UNICODE,则LPCTSTR代表 const char * ,因此直接使用就可以了. 

如果定义了_UNICODE ,LPCTSTR代表 const wchar_t* ,就不能直接使用了.

 

2,得到鼠标的位置

DWORD dw = GetMessagePos();

CPoint pt(LOWORD(dw),HIWORD(dw));//鼠标的屏幕坐标

CWnd::ScreenToClient();

 

3,得到文件的长度

方法一:HANDLE hHandle;

DWORD dwSize;

hHandle = ::CreateFile((LPCTSTR)strZipfile,GENERIC_READ,

       FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,

       NULL);

if(hHandle == INVALID_HANDLE_VALUE)

       return FALSE;

dwSize = ::GetFileSize(hHandle,NULL);

CloseHandle(hHandle);

 

方法二:CString szFile="c:/aaa.txt";

int nFileSize=0;

CFileFind finder;

if(finder.FindFile(szFile)){

       finder.FindNextFile();

       nFileSize = finder.GetLength();    //文件大小在这里

       finder.Close();

}

 

方法三:CStdioFile sf;

….

sf.GetLength();

 

 

4,CArray没有"=",但有copy.

CStringArray arr1,arr2;
 arr1.Add("0");
 arr2.Add("a");
 arr1.Copy(arr2);

 

5,如何得到view类的句柄

不要忘记了# include 文件

CMyView *pView = (CMyView *)((CMainFrame *)AfxGetMainWnd())->GetActiveView();

 

pView->m_hWnd就是

 

6,自定义消息

下面是增加自定义消息的步骤:

第一步:定义消息。开发Windows95应用程序时,Microsoft推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。

第二步:实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT。

LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)

{

// TODO: 处理用户自定义消息

...

return 0;

}

第三步:在类头文件的AFX_MSG块中说明消息处理函数:

class CMainFrame:public CMDIFrameWnd

{

...

// 一般消息映射函数

protected:

// {{AFX_MSG(CMainFrame)

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

afx_msg void OnTimer(UINT nIDEvent);

afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

}

第四步:在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)

//{{AFX_MSG_MAP(CMainFrame)

ON_WM_CREATE()

ON_WM_TIMER()

ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

如果用户需要一个整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage并使用ON_REGISTER_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同上。

 

7,wscanf是scanf的宽字符版本,用法与scanf是一样的,用来读取stdin流,并将信息存储到其参数列表指定的变量中。

cin 对象是由istream类所衍生出的,主要用来将数据由标准输入装置输入到程序中的变量,通过cin输入的数据,必须以字节流的格式组成,cin搭配“>>”用算符

VC雕虫小技集(三)

2007年02月08日 星期四 15:32

1,固定窗口大小,最大值为(600,400),最小值也为(600,400).

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 

{

    lpMMI->ptMaxTrackSize.x = 600;

       lpMMI->ptMaxTrackSize.y = 400;

       lpMMI->ptMinTrackSize.x = 600;

       lpMMI->ptMinTrackSize.y = 400;

       

       CFrameWnd::OnGetMinMaxInfo(lpMMI);

}

 

2,关闭对话框和窗口:

其实,一般窗口的销毁可以用DestoryWindow(),对话框的销毁可以用EndDialiog().

EndDialog(IDOK);

DoModal()的返回值为IDOK,但不会执行用户定义的OnOK.

只要发送WM_CLOSE消息,就会有响应的函数处理的。

SendMessage(WM_CLOSE);

PostMessage(WM_CLOSE);

void CTestDialog::OnButton1() 

{     

       GetParent()->DestroyWindow();

}

窗口和对话框一起关

PostMessage(WM_QUIT);

SendMessage(WM_QUIT);//不行

无模式对话框用DestroyWindow();

EndDialog

你再打开原对话框就有问题

 

3,全局变量的使用:

C***App中定义一个CString

使用时

void CDlgDlg::OnButton2() 

{

       ((CDlgApp*)AfxGetApp())->str = "test";

}

不要忘记了包含文件

 

4,如何让dos程序开机自动运行并且不显示 

自动运行好解决,写注册表run值,

vc+windows2000

main改为winmain

 

5,清除自动密码历史记录

浏览器中:

工具->Internet选项->内容->点"自动完成(U)"按钮->清除密码

http://tzsvc.xiloo.com/skill/sys/clear.htm

SHDeleteKey(HKEY_CURRENT_USER,

_T("Software//Microsoft//Internet Explorer//IntelliForms"));

 

6,执行一个可执行程序

方法一:

 ShellExecute(this->GetSafeHwnd(),"Open","f://he.txt",NULL,NULL,SW_SHOWNORMAL );

方法二:

PROCESS_INFORMATION pi;

    STARTUPINFO si;

    si.cb = sizeof(STARTUPINFO);

    si.lpReserved = NULL;

    si.lpDesktop = NULL;

    si.lpTitle = NULL;

    si.dwFlags = 0;

    si.cbReserved2 = 0;

    si.lpReserved2 = NULL;

    BOOL bres = CreateProcess(NULL,"test a.txt b.txt",NULL,NULL,false,

                        NORMAL_PRIORITY_CLASS,

                        NULL,NULL,&si,&pi);

if(bres==false)

{

AfxMessageBox("CreateProcess failed");

}

else

{

CloseHandle(pi.hThread);

DWORD dwret=WaitForSingleObject(pi.hProcess, 1000*30);

switch(dwret)

{

case WAIT_OBJECT_0:

DWORD dwexitcode;

bres = GetExitCodeProcess(pi.hProcess,&dwexitcode);

TCHAR exitmsgbuf[1024];

if(bres)

{

wsprintf(exitmsgbuf,"exit code:%d",dwexitcode);

}

else

wsprintf(exitmsgbuf,"exit code failed to return");

 

AfxMessageBox(exitmsgbuf);

break;

default:

AfxMessageBox("exit for other reason");,

VC雕虫小技四

2008年01月16日 星期三 11:31

1, 阅读程序常常要看此变量在那些地方值改变过

ctrl+f查找太麻烦

将此变量前加const

改变的地方报错



2, 看一个函数被那些函数调用.

方法:

1,调试状态下,view->debug window->call Stack

2,class view 的快捷菜单中选择called by



3, 在状态栏的最左边显示时间

static UINT indicators[] =

{

ID_SEPARATOR,//我们增加的

ID_SEPARATOR,

ID_INDICATOR_CAPS,

ID_INDICATOR_NUM,

ID_INDICATOR_SCRL,

};



int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

..... m_wndStatusBar.SetPaneInfo(1,ID_SEPARTOR,SBPS_NORMAL,60);

}



//菜单的响应函数

void CMainFrame::OnTest()

{

CTime t;

t = CTime::GetCurrentTime();

CString str = t.Format("%H - %M -%S");

m_wndStatusBar.SetPaneText(0,str);



}



4,模拟鼠标

::SetCursorPos((int)ptMouse->x,(int)ptMouse->y);

::mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);

::mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);

::mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);

::mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);



5,什么是WORD, DWORD

typedef unsigned short WORD

typedef unsigned long DWORD



6,移动控件

CWnd * pWnd = GetDlgItem(IDC_BUTTON1);

CRect r;

pWnd->GetWindowRect(&r);

r.left +=50;

r.right += 50;

pWnd->MoveWindow(r);



7, 如何让对话框中的CEdit响应ENTER键回车

GetDlgItem(IDC_EDIT1)->SetWindowText("111/r/n22");

右键属性

sytle -> Multiline选上

最好把want return 也选上



8,将c语言转化为汇编

VC++ provides this feature.

Project->Settings...

C/C++ tab

Category: Choose Listing Files

Listing file type:

select "Assembly with source code"



9,如何获得进程所消耗的CPU时间?

BOOL GetProcessTimes(

HANDLE hProcess,

LPFILETIME lpCreationTime,

LPFILETIME lpExitTime,

LPFILETIME lpKernelTime,

LPFILETIME lpUserTime

);



10,如何通过扩展名得到该扩展名所对应的图标?

SHGetFileInfo(path,

attr,

&sfi,

sizeof(SHFILEINFO),

SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_TYPENAME);







如何在拉着对话框的边框改变大小时,让它成比例的变化.就像视频播放软件哪样

处理wm_sizing消息

void CTest 1Dlg::OnSizing(UINT fwSide, LPRECT pRect)

{

CDialog::OnSizing(fwSide, pRect);

if((fwSide==WMSZ_BOTTOM) || (fwSide==WMSZ_TOP))

pRect->right=pRect->left+(pRect->bottom-pRect->top)*2;

else

pRect->bottom=pRect->top+(pRect->right-pRect->left)*0.5;

VC雕虫小技集(五)

2008年01月16日 星期三 11:32

1,vc中右键点击一个类或宏,可以察看他的定义,但如何返回初始地方呢?

install visual assist, and use Alt+left arrow

按菜单中的 后退 (<- 转45度)按钮

好像是又打开了一个文档,关闭它就行了



2,怎样获取系统菜单,并且弹出系统菜单?

void CTestsysmenuDlg::OnOK()

{

// click the OK button to show system menu(masterz)

POINT curPos;

GetCursorPos(&curPos);

SetForegroundWindow();

CMenu* pMenu=GetSystemMenu(false);

int nSelection=pMenu->TrackPopupMenu(TPM_LEFTBUTTON | TPM_LEFTALIGN |

TPM_BOTTOMALIGN|TPM_NONOTIFY|TPM_RETURNCMD, curPos.x, curPos.y, this);

DWORD dwpos= curPos.x + ((curPos.y<<16)&0xffff0000);

SendMessage(WM_SYSCOMMAND,nSelection,dwpos);

CString msg;

msg.Format("x:%d,y:%d; cursor.x=%d,cursor.y=%d",LOWORD(dwpos),HIWORD(dwpos),curPos.x,curPos.y);

OutputDebugString(msg);

}



3, 如何控制键盘上面的3 个灯的亮灭 (NUM LOCK ,CAPS LOCK SRCOLL LOCK)

#include

void SetNumLock( BOOL bState )

{

BYTE keyState[256];

GetKeyboardState((LPBYTE)&keyState);

if( (bState && !(keyState[VK_NUMLOCK] & 1)) ||

(!bState && (keyState[VK_NUMLOCK] & 1)) )

{



keybd_event( VK_NUMLOCK,

0x45,

KEYEVENTF_EXTENDEDKEY | 0,

0 );

// Simulate a key release

keybd_event( VK_NUMLOCK,

0x45,

KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,

0);

}

}



void main()

{

SetNumLock( TRUE );

}



4, 已经在VC的AppWizard中选择了中文后如何改为英文?

以某文件编辑器打开资源文件,在其中查找"Language",找到后可看到入下所示:

//Chinese (P.R.C) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)

#ifdef _WIN32

LANGUAGE LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED

#pragma code_page(936)

#endif //_WIN32

这段代码表示当前使用的代码页为936,所代表的语种为简体中文,将以下代码用如下代码替换:

//English (U.S) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)

#ifdef _WIN32

LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US

#pragma code_page(1252)

#endif //_WIN32



5,如何有效地判断鼠标点是否在控件的矩形区域内

DWORD dw = GetMessagePos();

CPoint pt(LOWORD(dw),HIWORD(dw));//鼠标的屏幕坐标

CRect r;

GetDlgItem(IDC_EDIT1)->GetClientRect(&r);

GetDlgItem(IDC_EDIT1)->ClientToScreen(&r);

if(r.PtInRect(pt))

AfxMessageBox("在控件内");



6,处理控件的右键,类向导上没有

BOOL CCDialogDlg::PreTranslateMessage(MSG* pMsg)

{

if(WM_MOUSEMOVE == pMsg->message)

if(pMsg->hwnd == GetDlgItem(IDC_BUTTON1)->GetSafeHwnd())

{

UINT nFlag = pMsg->wParam; // 状态,如ctrl是不按下

int xPos = LOWORD(pMsg->lParam); // horizontal position of cursor

int yPos = HIWORD(pMsg->lParam); // vertical position of cursor



}

return CDialog::PreTranslateMessage(pMsg);

VC雕虫小技集(六)

2008年01月16日 星期三 11:33

1,,如何取得Tree Control上的CheckBox状态~

OnInit中加:

m_treeCtrl.InsertItem("item1");

m_treeCtrl.InsertItem("item2");



void CCDialogDlg::OnButton1()

{

HTREEITEM hItem = m_treeCtrl.GetRootItem();

while(NULL != hItem)

{

CString str= m_treeCtrl.GetItemText(hItem);

if("item2" == str)

{

if(m_treeCtrl.GetCheck(hItem))

AfxMessageBox("选中");

}

hItem = m_treeCtrl.GetNextVisibleItem(hItem);

}

}



2,怎么用一个程序向另一个程序发送字符并让其显示出来

首先通过FindWindow取得windows程序的窗口句柄,

然后通过GetDlgItem取得其中输入框的窗口句柄,

最后,向该窗口句柄发送WM_CHAR消息即可显示字符

例如,对于Notepad窗口,可以以如下的方式向其中输入一个'a':

取得记事本的窗口句柄

HWND hWnd = ::FindWindow( NULL , "未定标题 - 记事本" );

取得其中输入框的窗口句柄

HWND hEdit = ::GetDlgItem( hWnd , 0x0F ); // 这里0x0F是编辑框的ID,可在SPY++中观察得到

向输入框中填写'a'

::SendMessage( hEdit , WM_CHAR , (WPARAM)'A' , 0x00000001 );



3, 当前时间:

CTime t = CTime::GetCurrentTime();

CString str; str.Format("%d-%d-%d",t.GetYear(),t.GetMonth(),t.GetDay());

str+= t.Format("--%H-%M-%S");

AfxMessageBox(str);

一定要用CTime::GetCurrentTime();GetCurrentTime()是一个过时的函数.



4, //改变按钮的背景色。

HBRUSH CRectWindow2View::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor);

switch (nCtlColor)

{

case CTLCOLOR_BTN:

{

CBrush Brush (RGB (128 , 0 , 128) );//你的颜色



CBrush* pOldBrush = pDC->SelectObject(&Brush);



pDC->SelectObject (pOldBrush );

}

}

return CFormView::OnCtlColor(pDC, pWnd, nCtlColor);

}



5, 加速键的使用.

在Dlg的头文件中加入:

HACCEL m_hAccel;

在Dlg的构造函数中加载加速键:

基于对话框的程序如何使用加速键?

m_hAccel=::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));//加速键ID

重载PreTranslateMessage函数:

BOOL CDlg::PreTranslateMessage(MSG* pMsg)

{

// TODO: Add your specialized code here and/or call the base class

if(m_hAccel!=NULL)

if(::TranslateAccelerator(m_hWnd,m_hAccel,pMsg))

return TRUE;

return CDialog::PreTranslateMessage(pMsg);

}



6,怎么把一个文件保存到其它地方?

if(!CopyFile("f://he.txt","d://he1.txt",true))

{

if(IDOK == MessageBox("有同名文件,你要覆盖吗?",NULL,MB_OKCANCEL))

{

CopyFile("f://he.txt","d://he1.txt",false);

}

else

return;

}

DeleteFile("f://he.txt");

 

http://blog.csdn.net/he_zhidan/

VC雕虫小技集()

何志丹

1,图片控件

右键属性 type : bitmap

你直接选image也行

IDB_BITMAP1位图的ID

m_ctrl 是与图片控件相关联的控制型变量

void CDlg2Dlg::OnButton1()

{

   CBitmap bitmap1;

   bitmap1.LoadBitmap(IDB_BITMAP1);

   m_ctrl.SetBitmap(bitmap1);

}

void CDlg2Dlg::OnButton2()

{

   CBitmap bitmap2;

   bitmap2.LoadBitmap(IDB_BITMAP2);

   m_ctrl.SetBitmap(bitmap2);

}

 

2, 什么我给控件赋变量时看不到cortrol ID?

1,单选按钮,group钩上.

2,静态控件把ID改成非IDC_STATIC.

 

3, 大小键盘的ascll

0-9 不同,+,-相同.

 

4,显示键盘输入的字符,尽量避免闪烁

void CSdiView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

   CDC * pDC = GetDC();

   StringData += nChar;

   CRect r(0,0,0,0);

   pDC->DrawText(StringData,&r,DT_LEFT|DT_CALCRECT);

   InvalidateRect(r);

       CView::OnChar(nChar, nRepCnt, nFlags);

}

void CSdiView::OnDraw(CDC* pDC)

{

   pDC->DrawText(StringData,CRect(0,0,1000,1000),DT_LEFT);

}

 

5,对话框A domodal()出一个对话框B,点击B一个按钮以后,要求调用A的类中的一个函数。

 

b的响应函数中处理:

((A *)GetParent())->fun();

binlcude A所在的文件

 

6, 删除文件夹及包含的文件

#include <direct.h>

void DeleteDirFile(CString sPath)

{

   WIN32_FIND_DATA fd;

   HANDLE hFind = ::FindFirstFile(sPath + "*.*",&fd);

  

   if (hFind != INVALID_HANDLE_VALUE)

   {     

       while (::FindNextFile(hFind,&fd))

       {

          //判断是否为目录

          if (fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)

          {

              CString name;

              name = fd.cFileName;

              //判断是否为...

              if ((name != ".") && (name != ".."))

              {

                 //如果是真正的目录,进行递归

                 DeleteDirFile(sPath + fd.cFileName + "//");

              }

          }

          else

              DeleteFile(sPath + fd.cFileName);

       }

       ::FindClose(hFind);

   }

   RemoveDirectory(sPath);

}

 

7, 改变控件字体的大小

LOGFONT logfont;

   CFont *pfont = m_ctrShowMessage.GetFont();

   pfont->GetLogFont( &logfont );

   logfont.lfHeight =logfont.lfHeight * 1.5;

   logfont.lfWidth  = logfont.lfWidth * 1.5;

   CFont font;

   font.CreateFontIndirect(&logfont);

   m_ctrShowMessage.SetFont(&font);

 

8, 想用classwizard新建一个类,但发现baseclass一栏中没有我要的基类(CObList类)

class type : Generic

自己输入

 

9, CTypedPtrList<CObList,CLine*>  lineList;

为什么VC报错:

c:/程序/scribble/scribbledoc.h(50) : error C2143: syntax error : missing ';' before '<'

# include "afxtempl.h"

是字符 l,不是数字1

 

10, 不提示成员函数,怎么办?

 CString s1="dfdsf";

 s1.

试一下以下三种方法:

1, Build->Clean, Build->ReBuildAll.

2,手动删除*.ncb

3,安装辅助工具vc_assist6

 

11, 我有6Radio Box如何分成3

将三个Radio Box Group点上

就分成三组了

与焦点顺序有关

VC中的一些常用方法(20条)

2007年07月18日 星期三 17:22

一、打开CD-ROM
mciSendString("Set cdAudio door open wait",NULL,0,NULL);
二、关闭CD_ROM
mciSendString("Set cdAudio door closed wait",NULL,0,NULL);
三、关闭计算机
OSVERSIONINFO OsVersionInfo; //包含操作系统版本信息的数据结构
OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OsVersionInfo); //获取操作系统版本信息
if(OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{
//Windows98,调用ExitWindowsEx()函数重新启动计算机

DWORD dwReserved;
ExitWindowsEx(EWX_REBOOT,dwReserved); //可以改变第一个参数,实现注销用户、
//关机、关闭电源等操作
// 退出前的一些处理程序
}
四、重启计算机
typedef int (CALLBACK *SHUTDOWNDLG)(int); //显示关机对话框函数的指针
HINSTANCE hInst = LoadLibrary("shell32.dll"); //装入shell32.dll
SHUTDOWNDLG ShutDownDialog; //指向shell32.dll库中显示关机对话框函数的指针
if(hInst != NULL)
{
//获得函数的地址并调用之
ShutDownDialog = (SHUTDOWNDLG)GetProcAddress(hInst,(LPSTR)60);

(*ShutDownDialog)(0);
}
五、枚举所有字体
LOGFONT lf;
lf.lfCharSet = DEFAULT_CHARSET; // Initialize the LOGFONT structure
strcpy(lf.lfFaceName,"");
CClientDC dc (this);
// Enumerate the font families
::EnumFontFamiliesEx((HDC) dc,&lf,                                                                                       
(FONTENUMPROC) EnumFontFamProc,(LPARAM) this,0);
//枚举函数
int CALLBACK EnumFontFamProc(LPENUMLOGFONT lpelf,
LPNEWTEXTMETRIC lpntm,DWORD nFontType,long lparam)

{
// Create a pointer to the dialog window
CDay7Dlg* pWnd = (CDay7Dlg*) lparam;
// add the font name to the list box
pWnd ->m_ctlFontList.AddString(lpelf ->elfLogFont.lfFaceName);
// Return 1 to continue font enumeration
return 1;
}
其中m_ctlFontList是一个列表控件变量
六、一次只运行一个程序实例,如果已运行则退出
if( FindWindow(NULL,"程序标题")) exit(0);
七、得到当前鼠标所在位置
CPoint pt;
GetCursorPos(&pt); //得到位置
八、上下文菜单事件触发事件:OnContextMenu事件

九、显示和隐藏程序菜单
CWnd *pWnd=AfxGetMainWnd();
if(b_m) //隐藏菜单
{
pWnd->SetMenu(NULL);
pWnd->DrawMenuBar();
b_m=false;
}
else
{
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME); ////显示菜单 也可改变菜单项
pWnd->SetMenu(&menu);
pWnd->DrawMenuBar();
b_m=true;
menu.Detach();
}
十、获取可执行文件的图标
HICON hIcon=::ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0);
if (hIcon &&hIcon!=(HICON)-1)
{
pDC->DrawIcon(10,10,hIcon);

}
DestroyIcon(hIcon);
十一、窗口自动靠边程序演示
BOOL AdjustPos(CRect* lpRect)
{//自动靠边
int iSX=GetSystemMetrics(SM_CXFULLSCREEN);
int iSY=GetSystemMetrics(SM_CYFULLSCREEN);
RECT rWorkArea;
BOOL bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), &rWorkAre
a, 0);
CRect rcWA;
if(!bResult)
{//如果调用不成功就利用GetSystemMetrics获取屏幕面积
rcWA=CRect(0,0,iSX,iSY);
}
else
rcWA=rWorkArea;
int iX=lpRect->left;
int iY=lpRect->top;

if(iX < rcWA.left + DETASTEP && iX!=rcWA.left)
{//调整左
//pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE);
lpRect->OffsetRect(rcWA.left-iX,0);
AdjustPos(lpRect);
return TRUE;
}
if(iY < rcWA.top + DETASTEP && iY!=rcWA.top)
{//调整上
//pWnd->SetWindowPos(NULL ,iX,rcWA.top,0,0,SWP_NOSIZE);
lpRect->OffsetRect(0,rcWA.top-iY);
AdjustPos(lpRect);
return TRUE;
}
if(iX + lpRect->Width() > rcWA.right - DETASTEP && iX !=rcWA.right-lpRect->W

idth())
{//调整右
//pWnd->SetWindowPos(NULL ,rcWA.right-rcW.Width(),iY,0,0,SWP_NOSIZE);
lpRect->OffsetRect(rcWA.right-lpRect->right,0);
AdjustPos(lpRect);
return TRUE;
}
if(iY + lpRect->Height() > rcWA.bottom - DETASTEP && iY !=rcWA.bottom-lpRect
->Height())
{//调整下
//pWnd->SetWindowPos(NULL ,iX,rcWA.bottom-rcW.Height(),0,0,SWP_NOSIZE);
lpRect->OffsetRect(0,rcWA.bottom-lpRect->bottom);
return TRUE;
}
return FALSE;
}
//然后在ONMOVEING事件中使用所下过程调用

CRect r=*pRect;
AdjustPos(&r);
*pRect=(RECT)r;
十二、给系统菜单添加一个菜单项
给系统菜单添加一个菜单项需要进行下述三个步骤:
首先,使用Resource Symbols对话(在View菜单中选择Resource Symbols...可以显
示该对话)定义菜单项ID,该ID应大于0x0F而小于0xF000;
其次,调用CWnd::GetSystemMenu获取系统菜单的指针并调用CWnd:: Appendmenu将菜单
项添加到菜单中。下例给系统菜单添加两个新的
int CMainFrame:: OnCreate (LPCREATESTRUCT lpCreateStruct)
{

//Make sure system menu item is in the right range.

ASSERT(IDM_MYSYSITEM<0xF000);
//Get pointer to system menu.
CMenu* pSysMenu=GetSystemMenu(FALSE);
ASSERT_VALID(pSysMenu);
//Add a separator and our menu item to system menu.
CString StrMenuItem(_T ("New menu item"));
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_MYSYSITEM, StrMenuItem);

}
十三、运行其它程序
//1、运行EMAIL或网址
char szMailAddress[80];
strcpy(szMailAddress,"mailto:netvc@21cn.com");
ShellExecute(NULL, "open", szMailAddress, NULL, NULL, SW_SHOWNORMAL);

//2、运行可执行程序
WinExec("notepad.exe",SW_SHOW); //运行计事本
十四、动态增加或删除菜单
1、 增加菜单
//添加
CMenu *mainmenu;
mainmenu=AfxGetMainWnd()->GetMenu(); //得到主菜单
(mainmenu->GetSubMenu (0))->AppendMenu (MF_SEPARATOR);//添加分隔符
(mainmenu->GetSubMenu (0))->AppendMenu(MF_STRING,ID_APP_ABOUT,_T("Always on
&Top")); //添加新的菜单项
DrawMenuBar(); //重画菜单
2、 删除菜单
//删除
CMenu *mainmenu;
mainmenu=AfxGetMainWnd()->GetMenu(); //得到主菜单

CString str ;
for(int i=(mainmenu->GetSubMenu (0))->GetMenuItemCount()-1;i>=0;i--) //取得菜
单的项数。
{
(mainmenu->GetSubMenu (0))->GetMenuString(i,str,MF_BYPOSITION);
//将指定菜单项的标签拷贝到指定的缓冲区。MF_BYPOSITION的解释见上。
if(str=="Always on &Top") //如果是刚才我们增加的菜单项,则删除。
{
(mainmenu->GetSubMenu (0))->DeleteMenu(i,MF_BYPOSITION);
break;
}
十五、改变应用程序的图标
静态更改: 修改图标资源IDR_MAINFRAME。它有两个图标,一个是16*16的,另一个是3

2*32的,注意要一起修改。
动态更改: 向主窗口发送WM_SETICON消息.代码如下:
HICON hIcon=AfxGetApp()->LoadIcon(IDI_ICON);
ASSERT(hIcon);
AfxGetMainWnd()->SendMessage(WM_SETICON,TRUE,(LPARAM)hIcon);
十六、另一种改变窗口标题的方法
使用语句 CWnd* m_pCWnd = AfxGetMainWnd( ),然后,再以如下形式调用SetWindowTe
xt()函数:
SetWindowText( *m_pCWnd,(LPCTSTR)m_WindowText);// m_WindowText可以是一个CSt
ring类的变量。
十七、剪切板上通过增强元文件拷贝图像数据
下面代码拷贝通过元文件拷贝图像数据到任何应用程序,其可以放置在CView派生类的函

数中。
CMetaFileDC * m_pMetaDC = new CMetaFileDC();
m_pMetaDC->CreateEnhanced(GetDC(),NULL,NULL,"whatever");
//draw meta file
//do what ever you want to do: bitmaps, lines, text...
//close meta file dc and prepare for clipboard;
HENHMETAFILE hMF = m_pMetaDC->CloseEnhanced();
//copy to clipboard
OpenClipboard();
EmptyClipboard();
::SetClipboardData(CF_ENHMETAFILE,hMF);                                                                                 
CloseClipboard();

//DeleteMetaFile(hMF);
delete m_pMetaDC;
十八、剪切板上文本数据的传送
把文本放置到剪接板上:
CString source;
//put your text in source
if(OpenClipboard())
{
HGLOBAL clipbuffer;
char * buffer;
EmptyClipboard();
clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1);
buffer = (char*)GlobalLock(clipbuffer);
strcpy(buffer, LPCSTR(source));
GlobalUnlock(clipbuffer);
SetClipboardData(CF_TEXT,clipbuffer);
CloseClipboard();
}
从剪接板上获取文本:

char * buffer;
if(OpenClipboard())
{
buffer = (char*)GetClipboardData(CF_TEXT);
//do something with buffer here
//before it goes out of scope
}
CloseClipboard();
十九、将捕捉屏幕图像到剪切版中
void CShowBmpInDlgDlg::OnCutScreen()
{
ShowWindow(SW_HIDE);
RECT r_bmp={0,0,::GetSystemMetrics(SM_CXSCREEN),
::GetSystemMetrics(SM_CYSCREEN)};                                                                                       
HBITMAP hBitmap;
hBitmap=CopyScreenToBitmap(&r_bmp);

//hWnd为程序窗口句柄
if (OpenClipboard())
{
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBitmap);
CloseClipboard();
}
ShowWindow(SW_SHOW);
}
HBITMAP CShowBmpInDlgDlg::CopyScreenToBitmap(LPRECT lpRect)
{
//lpRect 代表选定区域
{
HDC hScrDC, hMemDC;
// 屏幕和内存设备描述表
HBITMAP hBitmap, hOldBitmap;
// 位图句柄
int nX, nY, nX2, nY2;
// 选定区域坐标
int nWidth, nHeight;
// 位图宽度和高度
int xScrn, yScrn;
// 屏幕分辨率

// 确保选定区域不为空矩形
if (IsRectEmpty(lpRect))
return NULL;
//为屏幕创建设备描述表
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);
// 获得选定区域坐标
nX = lpRect->left;
nY = lpRect->top;
nX2 = lpRect->right;
nY2 = lpRect->bottom;
// 获得屏幕分辨率
xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES);
//确保选定区域是可见的
if (nX<0)

nX = 0;
if (nY<0)
nY = 0;
if (nX2>xScrn)
nX2 = xScrn;
if (nY2>yScrn)
nY2 = yScrn;
nWidth = nX2 - nX;
nHeight = nY2 - nY;
// 创建一个与屏幕设备描述表兼容的位图
hBitmap = CreateCompatibleBitmap
(hScrDC, nWidth, nHeight);
// 把新位图选到内存设备描述表中
hOldBitmap =(HBITMAP)SelectObject(hMemDC, hBitmap);
// 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight,
hScrDC, nX, nY, SRCCOPY);
//得到屏幕位图的句柄
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);

//清除
DeleteDC(hScrDC);
DeleteDC(hMemDC);
// 返回位图句柄
return hBitmap;
}
}
二十、如何将位图缩放显示在Static控件中
//在Staic控件内显示位图
void CShowBmpInDlgDlg::ShowBmpInStaic()
{
CBitmap hbmp;
HBITMAP hbitmap;
//将pStatic指向要显示的地方
CStatic *pStaic;
pStaic=(CStatic*)GetDlgItem(IDC_IMAGE);
//装载资源 MM.bmp是我的一个文件名,用你的替换
hbitmap=(HBITMAP)::LoadImage (::AfxGetInstanceHandle(),"MM.bmp",
IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);

hbmp.Attach(hbitmap);
//获取图片格式
BITMAP bm;
hbmp.GetBitmap(&bm);
CDC dcMem;
dcMem.CreateCompatibleDC(GetDC());
CBitmap *poldBitmap=(CBitmap*)dcMem.SelectObject(hbmp);
CRect lRect;
pStaic->GetClientRect(&lRect);
//显示位图
pStaic->GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Heigh
t(),
&dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
dcMem.SelectObject(&poldBitmap);
}

 

原创粉丝点击