2007年1月15日

在需要贴图的窗体上运行下面的代码:
    CBitmap bitmap;    
    BITMAP bm;

    bitmap.LoadBitmap(IDB_BITMAP1);                 
//从资源中导入一幅图片,bmp格式.
    bitmap.GetBitmap(&bm);                          //得到位图的信息,保存在bm结构中

    CDC MemDC;                                      
//创建一个内存dc,双缓存
    CDC *pDC = GetDC();                             //如果在onPaint函数中有pDC传过来的话,就不用这语句.

    MemDC.CreateCompatibleDC(pDC);                  
//从内存DC中创建兼容DC
    MemDC.SelectObject(&bitmap);                    //把位图导入到内存DC中
                        
    pDC
->StretchBlt(0,0,200,200,&MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);             //贴图,这个函数可以拉伸图片

posted @ 2007-01-15 10:09 梁海泉 阅读(397) | 评论 (0)编辑 收藏

如果想把以前画的线条檫除,则每次画线和檫除都运行以下的代码就OK了,关键是设置异或操作那一句,其他的画图也用这一句.就可以实现檫除了.

    CDC *  pDC  =  GetDC();                                    // 得到要画图的DC
    CPen pen(PS_SOLID, 4 ,RGB( 128 , 0 , 0 ));                     // 创建画笔
    CPen *  pOldPen  =  pDC -> SelectObject( & pen);               // 把笔选入DC
    pDC -> SetROP2(R2_XORPEN);                               // 设置异或操作,这一句是关键的
    pDC -> MoveTo( 0 , 0 );                                      // 移动画线
    pDC -> LineTo( 100 ,   100 );  
    pDC
-> SelectObject( & pOldPen);                           // 恢复画笔
    ReleaseDC(pDC);                                        // 释放DC

posted @ 2007-01-15 10:09 梁海泉 阅读(443) | 评论 (0)编辑 收藏

2007年1月12日


ANSI        UNICODE     通用
(char.h)    (wchar.h)        (tchar.h)

char         wchar_t          TCHAR
char *      wchar_t *        PTCHAR (PTSTR,LPWSTR,PWSTR,WCHAR)

printf       wprintf          _tprintf
scanf       wscanf          _tscanf

atoi         _wtoi            _ttoi
atol         _wtol            _ttol
itoa         _itow            _itot
ltoa         _ltow            _ltot

atof         _wtof            _tstof

strlen       wcslen          _tcslen
strcat       wcscat          _tcscat
strcpy      wcscpy         _tcscpy
strcmp     wcscmp        _tcscmp

posted @ 2007-01-12 15:48 梁海泉 阅读(2258) | 评论 (0)编辑 收藏

在需要产生多线程的地方,插入下面的函数

AfxBeginThread(Thread,LPVOID lpVoid);

其中AfxBeginThread的第一个参数是一个函数的名称,要是全局函数,而且要有如下的形式

UINT Thread(LPVOID lparam)
{
    //...这里是线程执行的代码
 return 0;
}

AfxBeginThread的第二个参数是一个无值类型的指针,就是Thread函数的参数,利用这个指针可以传递需要的数据,AfxBeginThread先把数据转化为无值指针型传递过去,Thread再把无值指针型转化为具体的类型。

posted @ 2007-01-12 15:45 梁海泉 阅读(267) | 评论 (0)编辑 收藏

typedef UINT (CALLBACK *  LPFNDLLFUNC1)(DWORD,UINT);


HINSTANCE hDLL;               
//  Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1;     //  Function pointer
DWORD dwParam1;
UINT  uParam2, uReturnVal;

hDLL 
=  LoadLibrary( " MyDLL " );
if  (hDLL  !=  NULL)
{
   lpfnDllFunc1 
=  (LPFNDLLFUNC1)GetProcAddress(hDLL,
                                           
" DLLFunc1 " );
   
if  ( ! lpfnDllFunc1)
   
{
      
//  handle the error
      FreeLibrary(hDLL);
      
return  SOME_ERROR_CODE;
   }

   
else
   
{
      
//  call the function
      uReturnVal  =  lpfnDllFunc1(dwParam1, uParam2);
   }

}


//////////////////////////////////////////////////////////////////////////////
#include  < stdio.h >

#include 
< windows.h >

typedef 
int ( * lpAddFun)( int int );  // 宏定义函数指针类型

int  main( int  argc,  char   * argv[])

{

HINSTANCE hDll; 
// DLL句柄 

lpAddFun addFun; 
// 函数指针

hDll 
=  LoadLibrary( " ..\\Debug\\dllTest.dll " );

if  (hDll  !=  NULL)

{

addFun 
=  (lpAddFun)GetProcAddress(hDll,  " add " );

if  (addFun  !=  NULL)

{

int  result  =  addFun( 2 3 );

printf(
" %d " , result);

}


FreeLibrary(hDll);

}


return   0 ;

}

////////////////////////////////////////////////////////////////////////
#pragma comment(lib, " dllTest.lib "

// .lib文件中仅仅是关于其对应DLL文件中函数的重定位信息

extern   " C "  __declspec(dllimport) add( int  x, int  y); 

int  main( int  argc,  char *  argv[])

{

int  result  =  add( 2 , 3 ); 

printf(
" %d " ,result);

return   0 ;

}

posted @ 2007-01-12 15:44 梁海泉 阅读(372) | 评论 (0)编辑 收藏

导入文件:
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
初始化:
if(!AfxOleInit())
{
 AfxMessageBox("初始化COM库失败!");
        return FALSE;
}
连接字段:
////////////////////////////////////////////////////////////////////////////////////////
连接SQL数据库用下面的字段:
"Provider=SQLOLEDB;Data Source=serverName;Initial Catalog=databaseName;
User ID=userName;Password=userPassword;"

连接ACCESS数据库用下面的字段:
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databasePath;
User ID=userName;Password=userPassword;"

DSN连接字段:
"Data Source=DSN;UID=;PWD=;"

**********************************************
                                             *
用UDL文件可以更快的达到配置的效果^_^         *
                                             *
连接字段设置为:                              *
"File Name="+GetExePath()+"\\connect.udl"    *
                                             *
**********************************************
CString GetExePath()
{
 // 得到模块全路径
 char exeFullPath[200];
 CString strPath;
 GetModuleFileName(NULL, exeFullPath, 200);
 strPath = CString(exeFullPath);

 // 转换为配置文件全路径
 strPath = strPath.Left(strPath.ReverseFind('\\'));
 return strPath;
}

CString path=GetExePath();
path="File Name="+path+"\\connect.udl";
LPCSTR ConStr=path;

////////////////////////////////////////////////////////////////////////////////////////

创建智能指针:

_ConnectionPtr  Conn;
_RecordsetPtr   Rs;

/**************************************************************************************/
   try
   {
 if (SUCCEEDED(Conn.CreateInstance("ADODB.Connection")))
 {
         LPCSTR ConStr="连接字段";    //如果使用UDL来连接的话:
                                             //"File Name="+GetExePath()+"\\Datasource.udl"
                                             //CString Path="File Name="+GetExePath()+"\\Datasource.udl"
                                             //LPCSTR ConStr=Path
  Conn->ConnectionTimeout=5;
  Conn->Open(ConStr,"","",adModeUnknown);

              //或者
              //     Conn->ConnectionString=ConStr;
              //     Conn->Open("","","",adModeUnknown);
 }
   }
   catch(_com_error e)
   { 
        // 显示错误信息
 CString errormessage;
 errormessage.Format("连接数据库失败!\r\n错误信息:%s", e.ErrorMessage());
 AfxMessageBox(errormessage);
 return;
   }
/**************************************************************************************/
   try
   {
 LPCSTR SqlStr="SQL字段";
 Rs.CreateInstance("ADODB.Recordset");
 Rs->Open(_bstr_t(SqlStr),
                 _variant_t((IDispatch *)Conn,true),
                 adOpenStatic,
                 adLockOptimistic,
                 adCmdText);
   }
   catch(_com_error e)
   { 
        // 显示错误信息
 CString errormessage;
 errormessage.Format("打开记录集失败!\r\n错误信息:%s", e.ErrorMessage());
 AfxMessageBox(errormessage);
 return;
   }
/**************************************************************************************/

posted @ 2007-01-12 15:43 梁海泉 阅读(310) | 评论 (0)编辑 收藏

在文件头定义
#pragma comment(lib,"Winmm.lib")
#include <mmsystem.h>

控制光驱关闭
mciSendString(_T("set cdaudio door closed"),0,0,NULL);

控制光驱打开
mciSendString(_T("set cdaudio door open"),0,0,NULL);

posted @ 2007-01-12 15:42 梁海泉 阅读(506) | 评论 (2)编辑 收藏

添加鼠标进入和离开事件

作者:梁海泉

   因为鼠标的进入和离开不是一个标准的window事件,所以要手动添加代码,先建一个OnMouseMove事件,再手动添加OnMouseLeave和OnMouseHover事件,分别在OnMouseMove事件的下面。

/*************************************************************************/

 afx_msg void OnMouseMove(UINT nFlags, CPoint point);
 afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
 afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);

/*************************************************************************/

BEGIN_MESSAGE_MAP(CTButton, CButton)
 ON_WM_MOUSEMOVE()
 ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
 ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
END_MESSAGE_MAP()

/*************************************************************************/

void  CTButton::OnMouseMove(UINT nFlags, CPoint point)
{
    TRACKMOUSEEVENT tme;
    tme.cbSize 
=   sizeof (tme);
    tme.hwndTrack 
=  m_hWnd;
    tme.dwFlags 
=  TME_LEAVE  |  TME_HOVER;
    tme.dwHoverTime 
=   1 ;
    ::TrackMouseEvent(
& tme);            
    CButton::OnMouseMove(nFlags, point);
}

LRESULT CTButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{    
    SetWindowText(
" 鼠标离开 " );
    
return   0 ;
}

LRESULT CTButton::OnMouseHover(WPARAM wParam, LPARAM lParam)
{
    SetWindowText(
" 鼠标进来 " );
    
return   0 ;
}

posted @ 2007-01-12 15:41 梁海泉 阅读(2001) | 评论 (0)编辑 收藏

移动窗体的函数,在窗体的WM_LBUTTONDOWN消息中,响应下面的函数

void CmyDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
    SendMessage(WM_NCLBUTTONDOWN,
                HTCAPTION,
                MAKELPARAM(point.x,point.y));
/*把消息发送到非客户区,使窗体认为是拖动了标题栏,所以窗体会跟着鼠标拖动*/
    CDialog::OnLButtonDown(nFlags, point);
}

posted @ 2007-01-12 15:39 梁海泉 阅读(397) | 评论 (0)编辑 收藏

/****************************************************************/

接收热键消息函数

在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间插入下面的宏

ON_MESSAGE(WM_HOTKEY,&CmyDlg::OnHotKey)

其中OnHotKey是要接收热键的对话框的成员函数。原型如下:

afx_msg HRESULT OnHotKey(WPARAM wp,LPARAM lp);

其中WPARAM是注册热键的时候的HotKeyID

/****************************************************************/

注册热键函数

RegisterHotKey(m_hWnd,HotKeyID,m,k);

参数1:要接收热键消息的窗口
参数2:热键号码,自己定义的一个整数,区分一个窗口中的多个热键
参数3:系统键
参数4:虚拟键


/****************************************************************/

从热键控件中得到热键

#define KEY(m,fm) if (m & HOTKEYF_ALT)     \
 fm |= MOD_ALT;                          \
 if (m & HOTKEYF_CONTROL)                    \
 fm |= MOD_CONTROL;                         \
 if (m & HOTKEYF_SHIFT)                     \
 fm |= MOD_SHIFT;                         \
 
CHotKeyCtrl m_HotKey;
m_HotKey.GetHotKey(k,m);
KEY(m,fm)
RegisterHotKey(m_hWnd,HotKeyID,m,k);

posted @ 2007-01-12 15:38 梁海泉 阅读(347) | 评论 (0)编辑 收藏

仅列出标题  下一页