//
//   函数: InitInstance(HINSTANCE, int)
//
//   目的: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
   HWND hIpAddrCtl;   hInst = hInstance; // 将实例句柄存储在全局变量中
 
//    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
//       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
   0, 0, 1000, 700, NULL, NULL, hInstance, NULL);
   if (!hWnd)
   {
      return FALSE;
   }   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
   //INITCOMMONCONTROLSEX IpAddrCtl ;
   //IpAddrCtl.dwSize = sizeof(IpAddrCtl);
   //IpAddrCtl.dwICC = ICC_INTERNET_CLASSES ;
   //InitCommonControlsEx (&IpAddrCtl);   //hIpAddrCtl = CreateWindow(WC_IPADDRESS,NULL,WS_CHILD ,
  // CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);// 
   CreateWindow("BUTTON", "增加角度", WS_CHILD|WS_VISIBLE,
   0, 0, 150, 50, hWnd, (HMENU)IDM_INC, hInstance, NULL);
   CreateWindow("BUTTON", "降低角度", WS_CHILD|WS_VISIBLE,
  150, 0, 150, 50, hWnd, (HMENU)IDM_DEC, hInstance, NULL);   CreateWindow("BUTTON", "增加水平方向图", WS_CHILD|WS_VISIBLE,
   300, 0, 150, 50, hWnd, (HMENU)IDM_INC_HRANGE, hInstance, NULL);   CreateWindow("BUTTON", "降低水平方向图", WS_CHILD|WS_VISIBLE,
   450, 0, 150, 50, hWnd, (HMENU)IDM_DEC_HRANGE, hInstance, NULL);   CreateWindow("BUTTON", "增加垂直方向图", WS_CHILD|WS_VISIBLE,
   600, 0, 150, 50, hWnd, (HMENU)IDM_INC_VRANGE, hInstance, NULL);   CreateWindow("BUTTON", "降低垂直方向图", WS_CHILD|WS_VISIBLE,
   750, 0, 150, 50, hWnd, (HMENU)IDM_DEC_VRANGE, hInstance, NULL);
   
   UpdateWindow(hWnd);   return TRUE;
}#define MULTIPLE 50
#define   PI  3.1415926//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的: 处理主窗口的消息。
//
//  WM_COMMAND - 处理应用程序菜单
//  WM_PAINT - 绘制主窗口
//  WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
//HDC hdc;
int i =0 ,j = 0 ; // 获取一个可供画图的DC,我这里就直接用桌面算了
// HDC hdc = GetWindowDC( GetDesktopWindow() );  HDC hdc = GetWindowDC(hWnd); // 创建红色1像素宽度的实线画笔
 //HPEN hpen1 = CreatePen( PS_SOLID, 0, RGB(255,0,0) );
 HPEN hpen1 = CreatePen( PS_DASH, 1, RGB(255,0,0) );
// 创建绿色5像素宽度的破折画笔,如果你想创建其他种类的画笔请参阅MSDN
HPEN hpen2 = CreatePen( PS_DASH, 5, RGB(0,255,0) ); HPEN hpen3 = CreatePen(PS_NULL,5, RGB(0,255,0)); // 创建一个实体蓝色画刷
HBRUSH hbrush1 = CreateSolidBrush( RGB(0,0,255) ); // 创造一个透明的画刷,如果你想创建其他种类的画刷请参阅MSDN
HBRUSH hbrush2 = (HBRUSH)GetStockObject( NULL_BRUSH );
// 创建一个填充画刷
HBRUSH hbrush3 = CreateHatchBrush(HS_FDIAGONAL,RGB(0,0,255) ); // 将hpen1和hbrush1选进HDC,并保存HDC原来的画笔和画刷
HPEN hpen_old = (HPEN)SelectObject( hdc, hpen1 );
HBRUSH hbrush_old = (HBRUSH)SelectObject( hdc, hbrush1 ); //SelectObject( hdc, hpen2 );
//SelectObject( hdc, hbrush3 );
int Raster = GetDeviceCaps(hdc,RASTERCAPS ); RECT ClientRect;
char cxChar,cyChar;
HWND hwndButton;
// user string TempStr="";
std::stringstream sstream; // 用之前要包含 头文件
switch (message)
{
case WM_CREATE:
break;
case WM_COMMAND:
wmId    = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case IDM_INC:
//MessageBox(hWnd,"aa","",NULL);
g_RsuParam.VerticalAngle++;
ClearWnd(hWnd);
UpdateWindow(hWnd);
//DrawRsu(hWnd,&g_RsuParam);
break;
case IDM_DEC:
g_RsuParam.VerticalAngle--;
ClearWnd(hWnd);
UpdateWindow(hWnd);
//DrawRsu(hWnd,&g_RsuParam);
break;
case IDM_INC_VRANGE:
g_RsuParam.VerticalAngleRange++;
ClearWnd(hWnd);
UpdateWindow(hWnd);
//DrawRsu(hWnd,&g_RsuParam);
break;
case IDM_DEC_VRANGE:
g_RsuParam.VerticalAngleRange--;
ClearWnd(hWnd);
UpdateWindow(hWnd);
//DrawRsu(hWnd,&g_RsuParam);
break;
case IDM_INC_HRANGE:
g_RsuParam.HorizonAngleRange++;
ClearWnd(hWnd);
UpdateWindow(hWnd);
//DrawRsu(hWnd,&g_RsuParam);
break;
case IDM_DEC_HRANGE:
g_RsuParam.HorizonAngleRange--;
ClearWnd(hWnd);
UpdateWindow(hWnd);
//DrawRsu(hWnd,&g_RsuParam);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps); //if (g_RsuParam.NearPoint == 0)
{
DrawRsu(hWnd,&g_RsuParam);
} EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

解决方案 »

  1.   


    void ClearWnd(HWND hWnd)
    {
    RECT rc;
    GetClientRect(hWnd,&rc);
    InvalidateRect(hWnd,&rc,TRUE);
    //  HDC hdc=GetDC(hWnd);
    //  Rectangle(hdc,rc.left,rc.top,rc.right,rc.bottom);
    }void DrawRsu(HWND hWnd,struct _RsuType *Rsu)
    {
    PAINTSTRUCT ps;
    //HDC hdc;
    int i =0 ,j = 0 ; // 获取一个可供画图的DC,我这里就直接用桌面算了 HDC hdc = GetDC(hWnd); // 创建红色1像素宽度的实线画笔
    HPEN hpen1=CreatePen( PS_SOLID, 1, RGB(255,0,0) );
    HPEN hpen_old ;
    HBRUSH hbrush1 = CreateSolidBrush(RGB(0,0,255));
    RECT ClientRect; string TempStr="";
    std::stringstream sstream; // 用之前要包含 头文件sstream hpen_old=(HPEN)SelectObject( hdc, hpen1 );
    SelectObject( hdc, hbrush1 );
    // TODO: 在此添加任意绘图代码... Rsu->NearAngle = Rsu->VerticalAngle-Rsu->VerticalAngleRange/2;
    Rsu->FarAngle  = Rsu->VerticalAngle+Rsu->VerticalAngleRange/2; Rsu->NearPoint = Rsu->Height*tan(Rsu->NearAngle*PI/180);
    Rsu->FarPoint  = Rsu->Height*tan(Rsu->FarAngle*PI/180); Rsu->MaxPointX = Rsu->Height*tan(Rsu->VerticalAngle*PI/180);
    Rsu->MaxPointY = (sqrt(pow(Rsu->Height,2)+pow(Rsu->MaxPointX,2)))*tan(Rsu->HorizonAngleRange/2*PI/180); Rsu->EllipseA = (Rsu->CenterPointX-Rsu->NearPoint); Rsu->CenterPointX = (Rsu->FarPoint+Rsu->NearPoint)/2;
    Rsu->EllipseB = abs(Rsu->MaxPointY/sqrt(1- pow( ((Rsu->CenterPointX-Rsu->MaxPointX)/Rsu->EllipseA),2) ));
    Rsu->CenterPointY = Rsu->EllipseB;

    // 画杆子
    MoveToEx( hdc, 200, 200, NULL );
    LineTo( hdc, 200, 200 + Rsu->Height*MULTIPLE);
    //sprintf(TempStr,"%f",Rsu->Height); string不能用于sprintf
    sstream.str("");
    sstream<<"高度: "<<Rsu->Height<<"m";
    TempStr=sstream.str();
    TextOut(hdc, 200+30, 130,TempStr.c_str(),TempStr.length()); sstream.str("");
    sstream<<"水平方向图: "<<Rsu->HorizonAngleRange<<"度";
    TempStr=sstream.str();
    TextOut(hdc, 200+30, 130+15,TempStr.c_str(),TempStr.length()); sstream.str("");
    sstream<<"垂直方向图: "<<Rsu->VerticalAngleRange<<"度";
    TempStr=sstream.str();
    TextOut(hdc, 200+30, 130+30,TempStr.c_str(),TempStr.length()); sstream.str("");
    sstream<<"垂直角度: "<<Rsu->VerticalAngle<<"度";
    TempStr=sstream.str();
    TextOut(hdc, 200+30, 130+45,TempStr.c_str(),TempStr.length());
    // 画天线的左右区域,避免覆盖了近端和远端的连线
    DrawRsuHorizonArea(hWnd,Rsu); // 画X轴
    MoveToEx( hdc, 0,  200 + Rsu->Height*MULTIPLE, NULL );
    LineTo( hdc, 1500,  200 + Rsu->Height*MULTIPLE); //画近端区域
    MoveToEx( hdc, 200, 200, NULL );
    LineTo( hdc, 200+Rsu->NearPoint*MULTIPLE, 200 + Rsu->Height*MULTIPLE);
    //画远端区域
    MoveToEx( hdc, 200, 200, NULL );
    LineTo( hdc, 200+Rsu->FarPoint*MULTIPLE, 200 + Rsu->Height*MULTIPLE);
    //画最强区域
    hpen1 = CreatePen( PS_DOT, 1, RGB(255,0,0) );
    hpen_old=(HPEN)SelectObject( hdc, hpen1 );
    MoveToEx( hdc, 200, 200, NULL );
    LineTo( hdc,200+Rsu->MaxPointX*MULTIPLE, 200 + Rsu->Height*MULTIPLE );
    SelectObject( hdc, hpen_old );
    // 写文字描述
    sstream.str("");
    sstream<<"近端: "<<Rsu->NearPoint<<"m";
    TempStr=sstream.str();
    TextOut(hdc, 200+Rsu->NearPoint*MULTIPLE,250 + Rsu->Height*MULTIPLE+30,TempStr.c_str(),TempStr.length()); sstream.str("");
    sstream<<"最强: "<<Rsu->MaxPointX<<"m";
    TempStr=sstream.str();
    TextOut(hdc, 200+Rsu->NearPoint*MULTIPLE, 250 + Rsu->Height*MULTIPLE+50,TempStr.c_str(),TempStr.length()); sstream.str("");
    sstream<<"中心: "<<Rsu->CenterPointX<<"m";
    TempStr=sstream.str();
    TextOut(hdc, 200+Rsu->NearPoint*MULTIPLE, 250 + Rsu->Height*MULTIPLE+70,TempStr.c_str(),TempStr.length()); sstream.str("");
    sstream<<"远端: "<<Rsu->FarPoint<<"m";
    TempStr=sstream.str();
    TextOut(hdc, 200+Rsu->NearPoint*MULTIPLE, 250 + Rsu->Height*MULTIPLE+90,TempStr.c_str(),TempStr.length());}
    void DrawRsuHorizonArea(HWND hWnd,_RsuType *Rsu)
    {
    PAINTSTRUCT ps;
    //HDC hdc;
    int i =0 ,j = 0 ;
    POINT start,end; // 获取一个可供画图的DC,我这里就直接用桌面算了 HDC hdc = GetDC(hWnd); // 创建红色1像素宽度的实线画笔
    HPEN hpen1 ;
    HPEN hpen_old ;
    RECT ClientRect;
    HBRUSH hbrush1=CreateSolidBrush(RGB(0,0,255)); string TempStr="";
    std::stringstream sstream; // 用之前要包含 头文件sstream hpen1 = CreatePen( PS_SOLID, 0, RGB(0,255,0) );
    hpen_old=(HPEN)SelectObject( hdc, hpen1 );
    SelectObject(hdc,hbrush1);
    // TODO: 在此添加任意绘图代码... start.x=200+Rsu->CenterPointX*MULTIPLE;
    start.y=200+Rsu->Height*MULTIPLE-Rsu->CenterPointY*MULTIPLE; end.x=200+Rsu->CenterPointX*MULTIPLE;
    end.y=200+Rsu->Height*MULTIPLE+Rsu->CenterPointY*MULTIPLE;//  MoveToEx(hdc,start.x,start.y ,NULL);
    //  LineTo(hdc,end.x,end.y ); Ellipse(hdc,200+Rsu->NearPoint*MULTIPLE,start.y,200+Rsu->FarPoint*MULTIPLE,end.y); sstream.str("");
    sstream<<"左侧: "<<Rsu->CenterPointY<<"m";
    TempStr=sstream.str();
    TextOut(hdc,end.x+80,30+end.y,TempStr.c_str(),TempStr.length()); sstream.str("");
    sstream<<"右侧: "<<Rsu->CenterPointY<<"m";
    TempStr=sstream.str();
    TextOut(hdc,end.x+80,30+end.y+30,TempStr.c_str(),TempStr.length());

    }
      

  2.   

    勒个去在wndproc里面 不分青红皂白创建那么多资源 而且不释放 不卡死才怪
      

  3.   

    好像真是你说的 ,不过那些资源不都是局部变量吗?函数执行完就释放了吗?
    HXXX不会自动释放的 
    都是一步步走过来的 你这个代码 一看就是小伙子写的
      

  4.   

        case WM_CREATE:
            break;为什么是空的, 把 创建 代码 放这里 !!!
      

  5.   


    case WM_CREATE要做的事情 我想放到 InitInstance里面做
      

  6.   

    “想放到 InitInstance里面做”
    有什么 充分的理由?
      

  7.   

    因为 在wndproc里面定义像HPEN或者HBRUSH这样的资源,然后在case WM_CREATE里面SelectObject的话,每进一次wndproc都会新建一次资源
      

  8.   

    完全不按规则出牌啊,建议先看看MSDN了解API
      

  9.   

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        int wmId, wmEvent;
        PAINTSTRUCT ps;
        //HDC hdc;
        int i =0 ,j = 0 ;
     
        // 获取一个可供画图的DC,我这里就直接用桌面算了
        // HDC hdc = GetWindowDC( GetDesktopWindow() );
     
         HDC hdc = GetWindowDC(hWnd);
     
        // 创建红色1像素宽度的实线画笔
         //HPEN hpen1 = CreatePen( PS_SOLID, 0, RGB(255,0,0) );
         HPEN hpen1 = CreatePen( PS_DASH, 1, RGB(255,0,0) );
        // 创建绿色5像素宽度的破折画笔,如果你想创建其他种类的画笔请参阅MSDN
        HPEN hpen2 = CreatePen( PS_DASH, 5, RGB(0,255,0) );
     
        HPEN hpen3 = CreatePen(PS_NULL,5, RGB(0,255,0));
     
        // 创建一个实体蓝色画刷
        HBRUSH hbrush1 = CreateSolidBrush( RGB(0,0,255) );
     
        // 创造一个透明的画刷,如果你想创建其他种类的画刷请参阅MSDN
        HBRUSH hbrush2 = (HBRUSH)GetStockObject( NULL_BRUSH );
     
     
        // 创建一个填充画刷
        HBRUSH hbrush3 = CreateHatchBrush(HS_FDIAGONAL,RGB(0,0,255) ); 这些代码 放 Create 中, 只需要创建一次 !!!!
      

  10.   

    推荐你一本书
     数据结构课程设计编程实例——基于Win32 API编程 
    书中的代码和视频见
    http://pan.baidu.com/s/1dD5sSgT
     http://pan.baidu.com/s/1c0pLPy4