#include <windows.h>
#pragma comment(lib, "comctl32.lib")
#include <commctrl.h>
#include "resource.h"
//#include <Winuser.h>
//#pragma comment(lib, "User32.lib")
//一个最简单的SDK程序
//步骤
//1.先实现WinMain函数
//2.实现一个处理消息的函数WinProc
//2.注册窗口类
//3.CreateWindowEx创建一个窗口
//4.ShowWindow显示窗口,UpdateWindow(hWnd);更新窗口
//5.GetMessage   TranslateMessage  DispatchMessage  三个函数处理消息
//再创建一个函数。
HINSTANCE ghinstance;
#define ID_NEWMENU       10234
HWND hWndToolBar;
LRESULT CALLBACK WinProc(HWND hwnd,        //响应消息的窗口句柄
 UINT msg,         //消息标识,如WM_CLOSE
 WPARAM wparam,    
 LPARAM lparam);
//typedef LRESULT /*CALLBACK*/ (*ProcPointer)(HWND, UINT, WPARAM, LPARAM);
typedef LRESULT (CALLBACK* ProcPointer)(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK NewWinProc(HWND hwnd,        //响应消息的窗口句柄
 UINT msg,         //消息标识,如WM_CLOSE
 WPARAM wparam,    
 LPARAM lparam)
{
switch (msg)                           //msg中保存的就是正要处理的消息

case WM_LBUTTONDOWN:
{
//MessageBox(hwnd, "Text", "Cap new Procedure", MB_ICONERROR);
break;
}
}
return WinProc(hwnd, msg, wparam, lparam);}
LRESULT CALLBACK WinProc(HWND hwnd,        //响应消息的窗口句柄
 UINT msg,         //消息标识,如WM_CLOSE
 WPARAM wparam,    
 LPARAM lparam)
{

static HICON hicon;
switch (msg)                           //msg中保存的就是正要处理的消息

case WM_LBUTTONDOWN:
{
LOGBRUSH ls;
ls.lbColor = RGB(255, 0, 0);
ls.lbHatch = HS_CROSS;
ls.lbStyle = BS_SOLID;
DWORD PenStyle[8] = {1,2,3,4,5,6,7,8};
HPEN pen2 = ExtCreatePen(PS_USERSTYLE | PS_GEOMETRIC, 3, &ls, 8, PenStyle);
SelectObject ( GetDC(hwnd), pen2 );
LineTo(GetDC(hwnd), 1000, 1000);
//BitBlt(GetDC(hwnd), 0, 0, 1000, 1000, memDC, 0, 0, SRCCOPY); break; }
case WM_GETICON: 
{
//MessageBox(hwnd, "text", "cap", MB_OK);
return (LRESULT)hicon;
//break;
} case WM_DESTROY:                       //这是我们自行处理的第一个消息

PostQuitMessage(0);            //发出一个WM_QUIT消息
break;                      //然后直接返回。
}
case WM_CREATE:
{
HMENU hMenu = CreateMenu();
AppendMenu(hMenu, MF_STRING, ID_NEWMENU, "退出");
InsertMenu(hMenu, 0, MF_STRING | MF_BYPOSITION, ID_NEWMENU, "HELLO2");
if(!SetMenu(hwnd, hMenu))
{
MessageBox(hwnd, "加载菜单失败", "提示", MB_OK);
}

TBBUTTON btn;
btn.iBitmap = STD_COPY;
btn.idCommand = 25630;
btn.fsState = TBSTATE_ENABLED;
btn.fsStyle = TBSTYLE_BUTTON;
btn.dwData = 0;
btn.iString = 0;
hWndToolBar = CreateToolbarEx(hwnd,
                                  WS_CHILD | WS_VISIBLE   
                                  | CCS_ADJUSTABLE | TBSTYLE_TOOLTIPS,
                                  25000,
                                  0,
                                  ghinstance,
                                  01,
                                  &btn,
                                  1,
                                  50,
                                  50,
                                  50,
                                  50,
                                  sizeof(TBBUTTON));
//添加按钮
//SendMessage(hWndToolBar, TB_ADDBUTTONS, 1, (LONG)&btn);
}
case WM_COMMAND:
{
switch((UINT)wparam)
{
case IDM_OPEN:
{
MessageBox(hwnd, "click open", "提示", MB_OK);
}
}
break;
}
default:
{
break;
}
}  
return DefWindowProc(hwnd, msg, wparam, lparam);
}int WINAPI WinMain(HINSTANCE hinstance,         //本程序的可柄
   HINSTANCE hprevinstance,     //本程序前一个实例的句柄,现在已无用
   LPSTR lpcmdline,             //程序启动时传递进来的命令行参数,可不用
   int ncmdshow)                //程序启动时传递进来的命令行参数,可不用
{
static UINT bBrushBits[8][8] = {0x80, 0x81, 0x82, 0x83, 0x84, 0x8a, 0x8b, 0x83,
                         0x20, 0x31, 0x22, 0x43, 0x14, 0x4a, 0x4b, 0x83,
 0x30, 0x41, 0x52, 0x43, 0x24, 0x5a, 0x4b, 0x53,
 0x40, 0xa1, 0x72, 0x43, 0x34, 0x6a, 0x5b, 0x83,
 0x50, 0x81, 0x22, 0x43, 0x44, 0xaa, 0x7b, 0x93,
 0x60, 0xc1, 0x82, 0x43, 0x54, 0xaa, 0xab, 0x83,
 0x70, 0x41, 0x82, 0x43, 0x64, 0x8a, 0x7b, 0x83,
 0x80, 0x41, 0x32, 0x43, 0x84, 0x8a, 0x4b, 0x83};  // bitmap bits  ghinstance = hinstance;
MSG msg;
WNDCLASSEX wndclass;                       //窗口类结构体变量
    //以下是对wndclass各成员赋值
    wndclass.cbSize = sizeof(WNDCLASSEX);      //用来保存本结构体的所占字节数
    wndclass.cbClsExtra=0;                     //略,我们可不必使用它,只要赋值为0就可
    wndclass.cbWndExtra =0;                    //略,同上
    wndclass.lpfnWndProc = WinProc;            //回调函数指针,用以指向前面那个回调函数。
    wndclass.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC | CS_DBLCLKS;    //窗口类型风格。比如,可设置“若移动窗口宽度时,则刷新整个窗口。
    wndclass.hInstance = hinstance;            //窗口所属的应用程序实例句柄,WinMain的第一个参数
    wndclass.hCursor =LoadCursor(NULL, IDC_ARROW);       //鼠标句柄,用以指定鼠标移入窗口时的样式
    wndclass.hIcon =LoadIcon(NULL,IDI_APPLICATION);      //大图标
    wndclass.hIconSm = LoadIcon(NULL,IDI_APPLICATION) ;  //小图标,窗口最小化后在任务栏显示的图标
    wndclass.lpszMenuName = NULL;                        //用来指向菜单资源名称字符串的指针,可让你的窗口有一个菜单
    wndclass.hbrBackground =(HBRUSH) GetStockObject(WHITE_BRUSH);
    wndclass.lpszClassName ="My SDK";                    //用来指向窗口类名字符串的指针作为这个窗口类的标识
//下面是利用wndcalss结构体的信息注册一个窗口类
    if (!RegisterClassEx(&wndclass))
        return 0;
// 将会在这里输入主函数的代码

HWND hWnd;
    hWnd=CreateWindowEx(NULL,              //这是用来指定扩展样式标志,绝大多数情况,我们只要指定为NULL,所以我不想多说
wndclass.lpszClassName,            //必须与wndclass.lpszClassName一样
"这是我的第一个窗口",              //窗口标题显示的字串
WS_OVERLAPPEDWINDOW ,              //这是用来指定窗口外观类型的
0,                                 //这是指定相对于桌面的窗口左上角位置(x坐标)。
0,                                 //这是指定相对于桌面的窗口左上角位置(y坐标)。
400,                               //指定窗口的宽度
400,                               //指定窗口的高度
NULL,                              //父窗口句柄
NULL,                              //可以为窗口指定一个菜单的,这个菜单将代替wndclass.lpszMenuName设置的菜单
hinstance,                         //要与wndclass.hInstance值相同,本应用程序的句柄代入这里。
NULL );                            //高级特征,现在我们只要设置为NULL就行。

    if (!hWnd)   //这里应该判断是否创建成功
{
        return 0;
}

ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
    while(GetMessage(&msg, NULL, 0, 0)) //获取一个消息,成功后会放在msg中。
    {       
TranslateMessage(&msg); //消息进行必要的处理转换。      
DispatchMessage(&msg); //调用WinProc,将msg的各项信息传递给WinProc
    } 

return 0;
}

解决方案 »

  1.   

    点击左键会画一条直线,这个直线的左在部分画在了工具栏上,为什么不能像MFC做的程序那样呢,就是说窗口的客户区应去掉菜单栏和工具栏部分,有什么解决办法吗????
    还有这个工具栏不能随着窗口的大小改变而改
      

  2.   

    是这样的。MFC怎么解决的呢?MFC用了框架/视图结构,在客户区单独创建了一个视图窗口,然后将工具栏区域空出来。你也可以另外创建一个客户区窗口,在窗口大小变化的时候(WM_SIZE),移动工具栏同时也移动客户区窗口(MoveWindow()),一般的工作交给客户区窗口完成。