win32 api中调用已写好的一个画线方法,为什么只在消息处理函数的switch之前才起作用?(如果在switch中调用画图方法,运行后就不显示线条)
因为我现在是想按一下按钮才使线条显示出来,我要怎么做才能在switch中调用画图方法??

解决方案 »

  1.   

    使用GETDC得到要画窗口的HDC,然后使用画图函数画就可以了。
      

  2.   

    hdc我已经得到了,图也是可以画的,可就是调用的位置如果在switch之后就不能显示,在switch之前就能显示。所以不是HDC的问题。
      

  3.   

    HDC          hdc;
       PAINTSTRUCT  ps;
    switch(message)
       {
       case WM_PAINT:
          hdc = BeginPaint(hWnd, &ps);
          OnPaint(hdc);
          EndPaint(hWnd, &ps);
          return 0;
        }
    这是我的一段代码,在OnPaint(hdc)中绘图,没问题。
      

  4.   

    一定要在WM_PAINT中调用吗?
    我现在是想按一下按钮才显示线条
    所以我的代码大概如下:
    HDC          hdc;
       PAINTSTRUCT  ps;switch(message)
    {
       DrawSin() ; //写在这里的话就能显示
       case WM_COMMAND:
       switch(LOWORD(wParam))
       {
         //正弦按钮   
         case IDB_OPTSIN:
    DrawSin() ; //写在这里的话就不能显示
         break;
       }
    }void DrawSin()
    {
    hdc = BeginPaint(hWndhWnd,&ps);
    MoveToEx(hdc, 200,75 , NULL);
    LineTo(hdc,400,75); MoveToEx(hdc, 300,35 , NULL);
    LineTo(hdc,300,115);

    EndPaint(hWndhWnd,&ps);

    }
      

  5.   

    HDC          hdc;
       PAINTSTRUCT  ps;switch(message)
    {
       case WM_COMMAND:
       switch(LOWORD(wParam))
       {
         //正弦按钮   
         case IDB_OPTSIN:
            {
             if(HIWORD(wParam)==BN_CLICKED)
        DrawSin() ; //这样就能显示了
             break;
            }
       }
    }
      

  6.   

    重载PreTranslateMessage函数....
    BOOL CTest2Dlg::PreTranslateMessage(MSG* pMsg) 
    {
         if(pMsg->hwnd == GetDlgItem(IDC_BUTTON1)->m_hWnd)
         {//当在这个按钮上进行操作时..
            switch(pMsg->message)
    {
           case WM_LBUTTONDOWN:
       DrawIt();
       break;
           case WM_KEYDOWN:
       if(pMsg->wParam == VK_RETURN)
              DrawIt();
                                break;
       default:
                                break;

    }
    return CDialog::PreTranslateMessage(pMsg);
    }
    也可以改成:
           switch(pMsg->message)
    {
           case WM_LBUTTONDOWN:
                       if(pMsg->hwnd == GetDlgItem(IDC_BUTTON1)->m_hWnd)
             DrawIt();
       break;
           case WM_KEYDOWN:
       if(pMsg->wParam == VK_RETURN && pMsg->hwnd == GetDlgItem(IDC_BUTTON1)->m_hWnd)
              DrawIt();
                                break;
       default:
                                break;

    第一:不能用WM_COMMAND消息.那样是不会触发的...
    第二:pMsg->hwnd== GetDlgItem(IDC_BUTTON1)->m_hWnd作为判断条件.
    程序在Win2000操作系统VC60编译通过,并测试成功!
      

  7.   

    阿酷你好。
    你上面提供的代码是不是只能在MFC下运行?
    我刚刚把它拷在WIN32下,说GetDlgItem这个方法不只一个参数。
    是为什么呢?
      

  8.   

    噢..是这样,我在CDialog里调用时,函数会自动加上隐含的指针this.所以上面的代码其实是this->GetDlgItem(IDC_BUTTON1),或者是GetDlgItem(IDC_BUTTON1,thi->m_hWnd).这个this指针其实就是隐含的第二个参数...但如果你拷贝到Win32时,没有这个隐含的指针.所以就会缺一个参数..
    那你可以这样.首先得到按钮所在的对话框或者窗口的指针....
    例如为pDialog.
    然后调用: pDialog->GetDlgItem(IDC_BUTTON1);就可以了..
      

  9.   

    GetDlgItem这个方法好象在WIN32下是不能用的。
    不过还是要谢谢你。:)
      

  10.   

    画图函数这么写void DrawSin(HWND hwnd)
    {
    HDC hdc = GetDC(hwnd);
    MoveToEx(hdc, 200,75 , NULL);
    LineTo(hdc,400,75); MoveToEx(hdc, 300,35 , NULL);
    LineTo(hdc,300,115);

    ReleaseDC(hwnd,hdc);
    }
    // 调用的时候这么调用
    case WM_COMMAND:
    wmId    = LOWORD(wParam); 
    wmEvent = HIWORD(wParam); 
    // Parse the menu selections:
    switch (wmId)
    {
       
    case IDM_ABOUT:
    DrawSin(hWnd);
       break;
                                }
      

  11.   

    那你把if(pMsg->hwnd == GetDlgItem(IDC_BUTTON1)->m_hWnd)
    改成
    if(LOWORD(wParam) == IDC_BUTTON1)试试..
    //这行语句就是判断操作是否是在指定的按钮上进行的.....
      

  12.   

    to何宗键:
    你好,你说的方法我试过了,但出现如下错误:'DrawSin' : function does not take 1 parameters请问是怎么回事?
      

  13.   

    我把你的drawSin函数给改了,现在那个函数要接受一个HWND型的句柄,你肯定是把句柄给漏了。你再仔细看看我贴的代码。
      

  14.   

    to何宗键:
    我没有漏写HWND句柄。
      

  15.   

    不会吧,我调试好了才贴上去的。是不是旧的DrawSin()函数定义忘了删掉了。
    在不行,要不然就留下你的邮箱,我把我的程序给你发过去。
      

  16.   

    to何宗键:
    我的信箱是:[email protected] 
    谢谢了。
      

  17.   

    BeginPaint(hWndhWnd,&ps);这个函数只能在wm_paint消息中进行调用,在其他消息中不能她来取得设备句柄,而要用getdc或其他的来取得设备句柄