杂七杂八

1、怎样使list control显示网格线

 m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES |
        LVS_EX_HEADERDRAGDROP);
用这个函数设置一下就可以了,那个LVS_EX_GRIDLINES就是网格线。

 

2、获取局域网内所有IP的计算机名的函数:

WNetEnummResource()

 

3、获取电脑硬盘号

OSVERSIONINFO ovi = { 0 };
        ovi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
        GetVersionEx( &ovi );
      
        if( ovi.dwPlatformId != VER_PLATFORM_WIN32_NT )
        {
            // Only Windows 2000, Windows XP, Windows Server 2003...
            return FALSE;
        }
        else
        {
            if( !WinNTHDSerialNumAsPhysicalRead( szSystemInfo, &uSystemInfoLen, 1024 ) )
            {
                WinNTHDSerialNumAsScsiRead( szSystemInfo, &uSystemInfoLen, 1024 );
            }
        }

4、拷贝目录函数

SHFileOperation();

5、选择颜色对话框

ChooseCloor(),具体用法如下:

CHOOSECOLOR cc;                 // common dialog box structure 
static COLORREF acrCustClr[16]; // array of custom colors 
HWND hwnd;                      // owner window
HBRUSH hbrush;                  // brush handle
static DWORD rgbCurrent;        // initial color selection

// Initialize CHOOSECOLOR 
ZeroMemory(&cc, sizeof(CHOOSECOLOR));
cc.lStructSize = sizeof(CHOOSECOLOR);
cc.hwndOwner = hwnd;    //如果没有父窗口,赋为NULL
cc.lpCustColors = (LPDWORD) acrCustClr;
cc.rgbResult = rgbCurrent;
cc.Flags = CC_FULLOPEN | CC_RGBINIT;
 
if (ChooseColor(&cc)==TRUE) {
    hbrush = CreateSolidBrush(cc.rgbResult);
    rgbCurrent = cc.rgbResult; 
}
6、判断两个CRgn是否相交
int CombineRgn(
  HRGN hrgnDest,      // handle to destination region
  HRGN hrgnSrc1,      // handle to source region
  HRGN hrgnSrc2,      // handle to source region
  int fnCombineMode   // region combining mode
);   
fnCombineMode = RGN_AND,若返回值等于NULLREGION说明没有相交的部分

 

7、调用bat文件

SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "e://a.bat";
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
MessageBox("完成批处理操作!");

8、TextOut()输出字体设置

作用是在屏幕上绘制屏幕高度是二十分之一设备窗口高度的红色的字符串
    CString strMark;
    strMark = _T("hello!");

    //*** Get the horizontal and vertical sizes of the printer.
    int nHorzSize = pDC->GetDeviceCaps(HORZRES);
    int nVertSize = pDC->GetDeviceCaps(VERTRES);
    //*** Center the text.
    // Initializes a CFont object with the specified characteristics.
    CFont font;
    COLORREF    colorRef;
    colorRef = pDC->SetTextColor(
                    RGB( 255, 0 ,0 )
                    );    // 红色

    
    int nSize;
    if( nVertSize > nHorzSize)
        nSize = nHorzSize/20.0;
    else
        nSize = nVertSize/20.0;
    VERIFY(font.CreateFont(
        nSize,                        // nHeight
        0,                         // nWidth
        0,                         // nEscapement
        0,                         // nOrientation
        FW_BOLD ,                 // nWeight
        FALSE,                     // bItalic
        FALSE,                     // bUnderline
        0,                         // cStrikeOut
        GB2312_CHARSET,              // nCharSet
        OUT_DEFAULT_PRECIS,        // nOutPrecision
        CLIP_DEFAULT_PRECIS,       // nClipPrecision
        DEFAULT_QUALITY,           // nQuality
        DEFAULT_PITCH ,               // nPitchAndFamily
        "宋体"));                  // lpszFacename
    
    CFont* def_font = pDC->SelectObject(&font);
    int mode;
    mode = pDC->GetBkMode();
    pDC->SetBkMode(TRANSPARENT);
    pDC->SetTextAlign(TA_CENTER | TA_TOP);
    pDC->TextOut((nHorzSize/2),(nVertSize/2),strMark,strMark.GetLength());
    pDC->SetBkMode(mode);
    pDC->SelectObject(def_font);
    font.DeleteObject();
    pDC->SetTextColor( colorRef );

9、枚举子窗口获得句柄

EnumChildWindows
The EnumChildWindows function enumerates the child windows that belong to the specified parent window by passing the handle to each child window, in turn, to an application-defined callback function. EnumChildWindows continues until the last child window is enumerated or the callback function returns FALSE.

BOOL EnumChildWindows(
  HWND hWndParent,         // handle to parent window
  WNDENUMPROC lpEnumFunc,  // pointer to callback function
  LPARAM lParam            // application-defined value
);

Parameters
hWndParent
Handle to the parent window whose child windows are to be enumerated. If this parameter is NULL, the parent window is the desktop window, and the function enumerates all top-level windows.
lpEnumFunc
Pointer to an application-defined callback function. For more information, see EnumChildProc.
lParam
Specifies an application-defined value to be passed to the callback function.
Return Values
If the function succeeds, the return value is nonzero.

9、静态控件改变字体颜色

处理 WM_CTLCOLORSTATIC 消息

10、在vc中打开记事本程序

ShellExecute(NULL,"open","notepad.exe",NULL,NULL,SW_SHOW);

11、检查网络的链接状态

InternetCheckConnection函数

12、如何控制文件拷贝的进程,如在进度条显示文件拷贝的进度

SHFileOperation 函数

13、解决与C库冲突的警告的办法

如这样的警告:LINK : warning LNK4098: defaultlib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library

在程序中加上这句就行了 #pragma comment(linker , "/NODEFAULTLIB:libc.lib")

14、如何获取程序自身的名称

char szCurDir[_MAX_PATH + 1];
::GetModuleFileName(NULL, szCurDir, _MAX_PATH);

15、如何调试release程序

VC6.0 中,菜单Project/Settings...选择Release状态
C/C++卡片中:
   Category 选择 general
   Optimizations 选择 Disable(Debug)
   Debug Info 选择 Program Database
Link 卡片中:
   Generate debug info
好了,现在Release就可以跟踪了

调试完成后,还原以前的设置,Rebuild All

16、如何避免程序被重复启动

在app的InitInstance中如下调用

#define UNIQUE_FLAG_NMS_SEG  "NMS-SEG-VOICE-MERGE-APPLICATION"

 HANDLE m_hOneInstance = CreateMutex(NULL,FALSE,UNIQUE_FLAG_NMS_SEG);
 if (GetLastError() == ERROR_ALREADY_EXISTS)
 {
  AfxMessageBox("程序已经运行");
  return FALSE;
 }

17、VARIANT和CString之间的相互转换

VARIANT v;    CString str = (LPCTSTR)(_bstr_t) v;

CString str = _T("ddd");    BSTR bstr;
bstr = str.AllocSysString();

18、如何用SendMessage控制Edit控件

GetDlgItem(IDC_EDIT1)->SendMessage(WM_CHAR,'A');

19、怎样获取局域网内PC的MAC地址

#include "iphlpapi.h" 使用函数 SendARP 即可

20、如何更改richedit的背景色

if(pWnd->GetDlgCtrlID()==ID_RICHEDIT1)
{
   CBrush m_brush;
   COLORREF m_color;
   m_color=RGB(255,0,0);
   m_brush.CreateSolidBrush(m_color);  
   pDC->SetBkColor(m_color);
   reture (HBRUSH) m_brush.GetSafeHandle();
}
else
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    reture hbr;
}

21、如何获得机器的启动时间

GetTickCount可以获得机器启动到现在的毫秒数

22、如何判断窗口是否被激活

BOOL IsWindowEnabled( HWND hWnd );
23、socket何时触发FD_READ和FD_CLOSE事件
FD_READ 事件】
我们会收到 FD_READ 事件通知我们去读取资料的情况有 :
(1)呼叫 WSAAsyncSelect 函式来对此 Socket 设定 FD_READ 事件时,
input buffer 中已有资料。
(2)原先系统的 input buffer 是空的,当系统再收到资料时,会通知我们。
(3)使用者呼叫 recv 或 recvfrom 函式,从 input buffer 读取资料,但是并
没有一次将资料读光,此时会再驱动一个 FD_READ 事件,表示仍有资料在
input buffer 中。
读者必须注意:如果我们收到 FD_READ 事件通知的讯息,但是我们故意
不呼叫 recv 或 recvfrom 来读取资料的话,尔後系统又收到资料时,并不会再次
通知我们,一定要等我们呼叫了 recv 或 recvfrom 後,才有可能再收到
FD_READ 的事件通知。
【FD_CLOSE 事件】
当系统知道对方已经将 Socket 关闭了的情况下(收到 FIN 通知,并和对方
做关闭动作的 hand-shaking),我们会收到 FD_CLOSE 的事件通知,以便我
们也能将这个相对的 Socket 关闭。FD_CLOSE 事件只会发生於 TCP Socket,因
为它是 connection-oriented;对於 connectionless 的 UDP Socket,即使设了
FD_CLOSE,也不会有作用的。
24、如何给线程发消息
BOOL PostThreadMessage(      

    DWORD idThread,     UINT Msg,     WPARAM wParam,     LPARAM lParam ); 注意,线程必须要有消息循环
24、如何处理如下编译错误?
nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)
这样的错误,明显就是两个被link到的library都提供了同名的函式。但直接ignore掉 LIBCMTD.lib当然是不行的,因为它是C的library。之所以发生这个问题,是因为MFC的library和C的library相冲突,必须设定它们被link的顺序,也就是先nafxcwd.lib再 LIBCMTD.lib。但是这二者都是default libraries,所以要怎麼设定它们的顺序呢?我找到一个解法其实挺tricky的:先把它们分别都ignore掉,再额外将它们加入。也就是说:在Link页签上的Ignore Libraries输入:nafxcwd.lib, libcmtd.lib,再到同一页签的Object/library modules输入:nafxcwd.lib libcmtd.lib。这麼一来,加入它们的顺序就成了我们所强迫设定的顺序了
25、如何控制结构体的对齐字节
#pragma pack(1)
struct node {
 char c;
 int num;
 short x;
 char b;
};
#pragma pack()
 如果不加#pragma pack两句,sizeof(node)=12,加了之后sizeof(node)=8
26、如何判断字符串中的汉字个数
/*
*GB2312包括了一二级汉字和9区符号,高位从0xa1到0xfe,低位也是从0xa1到0xfe,
*其中,汉字的编码范围为0xb0a1到0xf7fe。
*/
int CTestDlg::GetUNum(CString s_instr)//用来计算字符串中汉字和字符个数个数
{
    int length = s_instr.GetLength();
    if(length == 0)
        return length;
    int num = 0;
    for(int i = 0;i<length;i++)
    {
        byte c = s_instr[i];
        if(c >= 0xa1 && c <= 0xfe)
        {
            if(i+1>=length)
                break;
            
            c = s_instr[i+1];
            if(c >= 0xa1 && c <= 0xfe)
            {
                num++;
                i++;
                continue;
            }
        }
    }
    return num;
    
}
27、如何获取CComboBox中字符
 GetLBText函数获取字符串,GetCurSel函数是获得当前索引
28、如何获取对话框中的控件相对于对话框客户区左上角的坐标
GetDlgItem(IDC_BUTTON)->GetWindowRect(pRect); 得到屏幕坐标
再调用这个函数转换为相对于父窗口的坐标 GetDlgItem(IDC_BUTTON)->ScreenToClient(pRect); 
直接调用GetWindowRect(pRect); 可获得对话框的坐标,这样即可获得控件相对于对话框左上角的坐标

29、如何将图片设为桌面背景

修改注册表HCU/Control Panel/Desktop下ConvertedWallpaper字符串,图片完整路径

30、和CString的FindReverse功能相同的函数

char *strrchr( const char *string, int c ); 

Scan a string for the last occurrence of a character.

31、如何枚举所有窗口

EnumThreadWindows    GetWindowThreadProcessId

32、如何设置对话框标题

SetWindowText("...");

33、dll调试技术

DLL的调试vc++技术


假设:
    要调试hook.dll hook.h hook.lib

1。建立一个新工程Test,将hook整个工程目录拷贝到Test目录下

2。在Test工程中需要用到hook.dll的源文件中(或stdafx.h中)加入
     #include ".hookhook.h"
   这样在该源文件中使用"::"就可以索引到hook.h中所有的导出函数、
   变量以及类
  
3。在Test的工程设置->Link->Object/library modules中加入
     ./hook/debug/hook.lib

4。编译连接好Test之后,发现未找到hook.dll. 这需要设置path.
   可以在工程设置->Debug->Working directory中加入
     e:Testhookdebug
   也可以在autoexe.bat中设置路径

5。通过工程->Insert Project into Workspace将hook.dsp工程加入  
   Test项目中。

6。设置hook工程为活动工程,在工程>Debug>Executable for
   Debug session中加入:
     e: estdebug est.exe

7。现在设置断点,按F5可以正常调试了

注意:当调试的DLL被映射到其他的应用程序(非TEST)进程空间并运行时,在该DLL中设置的断点无效,当然可以通过MessageBox来查看变量,若该DLL是MFC扩展DLL,则还可以用TRACE或afxDump来查看变量

34、如何取得时间的毫秒

CString   mSecond;  
  struct   _timeb   timebuffer;          
  _ftime(&timebuffer);  
  mSecond.Format("%d",timebuffer.millitm);  
  nMinSecond=atoi(mSecond);  
或者

SYSTEMTIME   t;  
  GetLocalTime(&t);  
  t.wMilliseconds

35、关于内核对象

在所有的内核对象中,事件内核对象是个最基本的对象。
    事件内核对象包含:
        1)一个使用计数(与所有内核对象一样)
        2)一个用于指明该事件是个自动重置的事件还是一个人工重置的事件的布尔值
        3)另一个用于指明该事件处于已通知状态还是未通知状态的布尔值。
    事件能够通知一个操作已经完成。
    有两种不同类型的事件对象。
        1)一种是人工重置的事件
           当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。
        2)另一种是自动重置的事件    
           当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程。
    当一个线程执行初始化操作,然后通知另一个线程执行剩余的操作时,事件使用得最多。事件初始化为未通知状态,然后,当该线程完成它的初始化操作后,它就将事件设置为已通知状态。这时,一直在等待该事件的另一个线程发现该事件已经得到通知,因此它就变成可调度线程。这第二个线程知道第一个线程已经完成了它的操作。

36、如何将字符串拷贝到剪贴板

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();

37、如何判断开机多长时间

 DWORD total = GetTickCount()/1000;
        DWORD year = total/(3600*24*365);
        DWORD day = (total-year*(3600*24*365))/(3600*24);
        DWORD hour = (total-year*(3600*24*365)-day*(3600*24))/(3600);
        DWORD minute = (total-year*(3600*24*365)-day*(3600*24)-hour*(3600))/60;
        DWORD second = (total-year*(3600*24*365)-day*(3600*24)-hour*(3600)-minute*60);

        cout<<year<<"年"
            <<day<<"天"
            <<hour<<"小时"
            <<minute<<"分"
            <<second<<"秒";

38、两种lib的区别

lib有两种,一种是静态lib,如果你的程序需要这种lib里的函数,你就要讲这个lib链接到你的程序里,然后你的程序就可以独立的运行了,不再需要lib文件的支持。另一种是dll的导出lib,这种lib实际上没有执行代码,里面只是dll的信息,如函数的入口地址等,这种lib在链接到你的程序里后,程序在运行的时候不需要lib的支持,但必须要相应dll的支持。因为链接进去的lib不包含执行代码,这是和上面的静态lib不同的。

39、如何重启电脑

OSVERSIONINFO OsVersionInfo; //包含操作系统版本信息的数据结构
    OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    GetVersionEx(&OsVersionInfo); //获取操作系统版本信息
    if(OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
    {
        //Windows98,调用ExitWindowsEx()函数重新启动计算机
        DWORD dwReserved;dwReserved;
        ExitWindowsEx(EWX_LOGOFF,EWX_FORCE); //可以改变第一个参数,实现注销用户、
        //关机、关闭电源等操作
        // 退出前的一些处理程序
    }

40、如何获取活动视图

MDI:

CMDIFrameWnd *pFrame =
             (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;

// Get the active MDI child window.
CMDIChildWnd *pChild =
             (CMDIChildWnd *) pFrame->GetActiveFrame();

// or CMDIChildWnd *pChild = pFrame->MDIGetActive();

// Get the active view attached to the active MDI child
// window.
CMyView *pView = (CMyView *) pChild->GetActiveView();

SDI:

CFrameWnd* pFrameWnd = (CFrameWnd*)theApp.GetMainWnd();
CMyView* pView = (CMyView*)pFrameWnd->GetActiveView();

41、如何改变Edit控件的字体

LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));          // clear out structure
lf.lfHeight = 12;                         // request a 12-pixel-height font
strcpy(lf.lfFaceName, "Arial");           // request a face name "Arial"
HFONT hfont = ::CreateFontIndirect(&lf);  // create the font

// Convert the HFONT to CFont*.
CFont* pfont = CFont::FromHandle(hfont);
m_editFormat.SetFont( pfont );//m_editFormat这是与相关edit控件关联的变量

// Done with the font. Delete the font object.
::DeleteObject(hfont);

42、字节反序算法

unsigned char revchar1 (unsigned char b)
{
    b = ((b & 0x55u) << 1) | ((b & 0xaau) >> 1);
    b = ((b & 0x33u) << 2) | ((b & 0xccu) >> 2);
    b = ((b & 0x0fu) << 4) | ((b & 0xf0u) >> 4);
    return b;
}

43、如何通过进程ID获取窗口句柄

EnumWindows取得顶层窗口的句柄
对每个顶层窗口的句柄调用
GetWindowThreadProcessId
这时候可以获得这个窗口所在进程的ID
比较一下你的那个进程的ID即可

44、如何在工程间共享资源

如要将A工程中的对话框资源拷贝到B工程中使用,在A工程的ClassView中右键单击该对话框类选择Add to Gallery,然后在B工程中执行Project->Add to Project->components and controls...

45、模拟按键

keybd_event(VK_MENU,0,0,0);
keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,0);//按下去,别忘了弹回来。

46、如何更改static控件的字体

将Static与m_static关联(Contorl)  
  CFont   font;     //不能定义为局部变量
  LOGFONT   log;    //不能定义为局部变量
  GetObject(::GetStockObject(DEFAULT_GUI_FONT),sizeof(log),&log);  
  log.lfHeight=20;     //改  
  log.lfWidth=20;       //改  
  log.lfCharSet=GB2312_CHARSET;  
  lstrcpy(log.lfFaceName,"黑体");  
  font.CreateFontIndirect(&log);  
  m_static.SetFont(&font);

47、十六进制和字符串的转换

 char* str = "0xFF";
 
 int i;
 sscanf(str,"%x",&i);   //i=255(0xFF)

char str1[32];

sprintf(str1,"%02x",0xA13B);  //str1="a13b"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值