剪贴板(上)

下面代码演示了如何把文本复制到剪贴板和如何从剪贴板获得文本
#include  < windows.h >
#include 
" resource.h "
#pragma comment(linker, "subsystem:windows") //使你可以打开此c源文件进行编译而不需设置工程设置,当然菜单资源还是要你自己建
// 过程函数的返回值都是LRESULT,类型都是CALLBACK
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
int  WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpszCmdLine, int  nCmdShow)
{
    HWND hwnd;        
// 主窗口句柄,在CreateWindow中赋值
    MSG msg;         // 消息变量,在GetMessage中使用
    WNDCLASS wndclass;         // 窗口类
    TCHAR *  szAppName  =  TEXT( " Clipboard " );     // 类名和窗口名
    wndclass.hbrBackground  =  (HBRUSH)GetStockObject(WHITE_BRUSH);     // 窗口背景
    wndclass.hCursor  =  LoadCursor(NULL,IDC_ARROW);         // 鼠标
    wndclass.hIcon  =  LoadIcon(NULL,IDI_APPLICATION);     // 图标
    wndclass.lpszClassName  =  szAppName;         // 类名
    wndclass.cbClsExtra  =   0 ;         // 类的额外参数
    wndclass.cbWndExtra  =   0 ;         // 窗口的额外参数.用于基于同一窗口类的窗口各自区分.
                                    
// 在自定义对话框类时必须指定为DLGWINDOWEXTRA的大小
    wndclass.lpszMenuName  =  TEXT( " MAINMENU " );     // 菜单名.可以用作子窗口的id
    wndclass.style  =  CS_HREDRAW  |  CS_VREDRAW;     // 窗口风格
    wndclass.lpfnWndProc  =  WndProc;         // 窗口过程
    wndclass.hInstance  =  hInstance;         // 包含窗口过程的实例句柄

    
if ! RegisterClass( & wndclass) )         // 注册窗口类
         return   0 ;
    hwnd 
=  CreateWindow(                 // 创建窗口
                szAppName,                 // 窗口类名
                szAppName,                 // 窗口标题
                WS_OVERLAPPEDWINDOW,     // 窗口风格
                CW_USEDEFAULT,             // 初始的x坐标
                CW_USEDEFAULT,             // 初始的y坐标
                CW_USEDEFAULT,             // 初始的宽度
                CW_USEDEFAULT,             // 初始的高度
                NULL,                     // 父窗口
                NULL,                     // 菜单
                hInstance,                 // 和窗口相关的实例句柄
                NULL                     // 额外参数
                );
    ShowWindow( hwnd,nCmdShow );        
// 显示窗口
    UpdateWindow( hwnd );                 // 更新窗口
     while ( GetMessage( & msg,NULL, 0 , 0 ) )     // 消息循环
    {
        TranslateMessage(
& msg);             // 将WM_XXXKEYXXX消息翻译为WM_CHAR消息
        DispatchMessage( & msg);             // 传递消息到窗口过程
    }    
    
return  msg.wParam;                     // 返回
}
LRESULT WINAPI WndProc( HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam )
{
    
static   char   * pText;
    
switch ( message )
    {
    
case  WM_INITMENUPOPUP:
        EnableMenuItem(
            (HMENU)wParam,
            IDM_FILE_PASTE, 
            IsClipboardFormatAvailable(CF_TEXT) 
?  MF_ENABLED : MF_GRAYED);
        
return   0 ;
    
case  WM_DESTROY:
        PostQuitMessage(
0 );
        
return   0 ;
    
case  WM_COMMAND:
        
switch ( LOWORD(wParam) )
        {
        
case  IDM_FILE_COPY:
            {
                HGLOBAL hglobal 
=  GlobalAlloc(GMEM_MOVEABLE ,  6 ); // 分配剪贴板数据的空间
                 if ( hglobal  ==  NULL )
                {
                    
return   0  ;
                }
                pText 
=  ( char * )GlobalLock(hglobal); // 取得操作刚分配了的空间的指针
                lstrcpy(pText,  " hello " ); // 把数据复制到该指针指向的空间
                GlobalUnlock(hglobal);
                OpenClipboard(hwnd);    
// 打开剪贴板
                EmptyClipboard();         // 清空剪贴板
                SetClipboardData(CF_TEXT, hglobal);     // 真正把数据放到剪贴板
                CloseClipboard();         // 关闭剪贴板
                 return   0 ;
            }
        
case  IDM_FILE_PASTE:
            {
                RECT rc;
                HDC hdc 
=  GetDC(hwnd);
                HGLOBAL hglobal;

                OpenClipboard(hwnd);    
// 打开剪贴板
                hglobal  =  GetClipboardData(CF_TEXT);     // 取得存放剪贴板数据的空间的句柄
                 if (hglobal  ==  NULL)
                {
                    
return   0 ;
                }
                pText 
=  ( char * )malloc(GlobalSize(hglobal));  // 分配空间以保存从剪贴板获得的数据
                 if ( pText  ==  NULL )
                {
                    
return   0 ;
                }
                lstrcpy(pText, GlobalLock(hglobal));
// 真正从剪贴板获得数据
                GlobalUnlock(hglobal);  // GlobalLock与GlobalUnlock的调用要成对
                CloseClipboard();  // OpenClipboard与CloseClipboard的调用要成对
                
                GetClientRect(hwnd, 
& rc);
                DrawText(hdc, pText, 
- 1 & rc, DT_CENTER  |  DT_EXPANDTABS);
                free(pText); 
// malloc与free的调用要成对
                 return   0 ;
            }
        }
    }
    
return  DefWindowProc( hwnd,message,wParam,lParam );
}

你可能感兴趣的:(职场,文本,休闲,剪贴版)