VC雕虫小技集(一)
1,避免随机数相同,可以取当前时间,读文件,读任意内存(如未定义变量,有一定危险).
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,如何删除一个类.
把文件删除,再打开类向导(Ctrl+W)
类向导找不到文件,会弹出一个对话框
ReMove就行了.
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雕虫小技集(二)
何志丹
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,数组没有"=",但有copy.
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雕虫小技集(三)
何志丹
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雕虫小技集(四)
何志丹
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雕虫小技集(五)
何志丹
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 <windows.h>
void SetNumLock( BOOL bState )
{
BYTE keyState[256];
GetKeyboardState((LPBYTE)&keyState);
if( (bState && !(keyState[VK_NUMLOCK] & 1)) ||
(!bState && (keyState[VK_NUMLOCK] & 1)) )
{
// Simulate a key press
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雕虫小技集(六)
何志丹
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");
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();
在b中inlcude 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, 我有6个Radio Box如何分成3组
将三个Radio Box的 Group点上
就分成三组了
与焦点顺序有关