论坛首页 编程语言技术论坛

What the f*** of Visual C++?

浏览 28123 次
精华帖 (5) :: 良好帖 (8) :: 新手帖 (6) :: 隐藏帖 (11)
作者 正文
   发表时间:2009-11-12   最后修改:2009-11-18
C++
一直崇拜c/c++的牛人,崇拜那些只有几百K甚至几十K的程序。

我知道只有C/C++可以帮助我。

我的内心发出狂热的呼喊:我要学C++

于是无奈之下安装了N个G的Visual studio。。。

Visual C++,我回来了,请不要抛弃我,虽然以前我没有耐心的学习你。。。

我潜心阅读MSDN的文档。。。

MFC,不是我想要的。。。一个很莫名奇妙的框架,以前就是他这个第三者破坏了我和C++良好的感情

Winform是什么??原来是披着C++外衣的.net狼。

我要的是最美最纯的C,接受C++其实是一种妥协,但还要我接受这些浮华的勒涩吗?NO!!!

我知道,windows下我也可以用printf来写最纯的C,但是,我们还需要GUI,除了要单纯的心,我们要一个美丽的脸庞。

GDI、GDIPlus,WIN API,非常好,我终于找到我的梦中情人了,我要的就是这样的最单纯的程序。

我潜心的读相关的文档,就像在读着盼望已久的情书。。。

TRUE,FALSE,VOID,怎么不是 true ,false ,void,我是不是看花了。

WCHAR NWPSTR, LPWSTR, PWSTR; 。。。 我理解这良苦用心,希望我更容易看懂。

INT_PTR,LRESULT 。。。

虽然我很爱她,但我终于忍不住对她发火了:美女,请问你真的是C小姐吗?你可以正常点说话吗?

Please help me , How could I found my Miss C ?

===================================
最后补充一下,看了下WCHAR,LPWSTR这些玩意的定义,最终是用到了 __wchar_t 这个非标准的关键字。
MS定义这些别名我想也是为了适应将来的编译器变化。
另外在32位和64位操作系统中,int、long、的长度也是不一样的,甚至64位windows和64位的 nix的long长度也不一样。
请看此文:一个长整数的自述
说到底 c/c++ 标准还不完善,但是我比较不满“Visual C++”的是,他太special了。
   发表时间:2009-11-12  
WTL... TAKE a try...
0 请登录后投票
   发表时间:2009-11-12  
lz投奔linux吧。。。。
0 请登录后投票
   发表时间:2009-11-12   最后修改:2009-11-12
mikeandmore 写道
lz投奔linux吧。。。。



你在耍小白么?诸如wchar是C++标准中的unicode字符,你就是滚到linux里也是如此.GCC gui的能力弱得要死.
另外有一些是windows api的,你不调用Windows API,何必关注?



LZ到底是要从C写GUI界面,还是用C++写GUI界面? 以我看来,你还是放弃想用C写界面的想法吧:一个什么都不做的Windows界面,用C大概要300多行,你自己要去处理所有的消息。。


用MFC创建个界面,那不是相当简单的么?何至于那么难哈?


下面就是纯C写的,不知道楼主看了有什么感想
 BOOL        bOnTop, bGrayScale, bBackground = TRUE;   
 COLORREF    cForeground = RGB(255,255,255), cBackground = RGB(0,0,0);   
 HBRUSH      hBackGrnd;   
 int         iCopyMode = 0;   
    
 /*/ ***** Function prototypes for static functions      ***** /*/   
    
 void GrabColor (HWND hwnd, HWND hwndCtl);   
 void UpdateDisplay (HWND hwnd, HWND hStatusRGB, HWND hStatusHex, int R, int G, int B);   
    
 /*/ ***** Function prototypes for callback functions    ***** /*/   
    
 BOOL CALLBACK DialogProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);   
    
 /*/ ***** Function prototypes for message handlers      ***** /*/   
    
 static void Dialog_OnCommand        (HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);   
 HBRUSH      Dialog_OnCtlColorStatic (HWND hwnd, HDC hdc, HWND hChild, int type);   
 static void Dialog_OnHScroll        (HWND hwnd, HWND hctl, UINT code, int pos);   
 static BOOL Dialog_OnInitDialog     (HWND hwnd, HWND hwndFocus, LPARAM lParam);   
 void        Dialog_OnTimer          (HWND hwnd, UINT id);   
    
 /*/  
 / / int WINAPI  
 / /     WinMain (HINSTANCE, HINSTANCE, LPSTR, int)  
 / /  
 / / PURPOSE:  
 / /     Entry point for the application.  
 / /  
 / / COMMENTS:  
 / /     This function initializes the application and processes the  
 / /     dialog box.  
 /*/   
    
 int WINAPI   
 WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)   
 {   
     /*/  
     / / Instead of using GetMessage(), TranslateMessage(), and DispatchMessage()  
     / / for the main message loop, we simply create a Dialog Box and let Windows  
     / / handle it internally.  
     /*/   
    
     DialogBox (hInstance, MAKEINTRESOURCE(IDD_DIALOGBOX), NULL, (DLGPROC)DialogProc);   
    
     /*/ clean up /*/   
     if(hBackGrnd) DeleteObject(hBackGrnd);   
    
     return 1;   
    
     /*/ These prevent 'unreferenced formal parameter' warnings /*/   
     hPrevInstance;   
     lpCmdLine;   
     nCmdShow;   
 }   
    
 /*/  
 / / BOOL CALLBACK  
 / /     DialogProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)  
 / /  
 / / PURPOSE:  
 / /     Dialog function for the Colorz dialog box.  
 / /     Processes messages sent by calling the  
 / /     appropriate functions  
 /*/   
    
 BOOL CALLBACK   
 DialogProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)   
 {   
     /*/ The message cracker macros used here are defined in windowx.h /*/   
    
     switch (message)   
     {   
         case WM_COMMAND:                /*/ Notification from a control                 /*/   
             return HANDLE_WM_COMMAND (hwnd, wParam, lParam, Dialog_OnCommand);   
    
         case WM_CTLCOLORSTATIC:         /*/ Paint a static control's color              /*/   
             return HANDLE_WM_CTLCOLORSTATIC (hwnd, wParam, lParam, Dialog_OnCtlColorStatic);   
    
         case WM_HSCROLL:                /*/ Notification from a horizontal scrollbar    /*/   
             return HANDLE_WM_HSCROLL (hwnd, wParam, lParam, Dialog_OnHScroll);   
    
         case WM_INITDIALOG:             /*/ Initialization of controls complete         /*/   
             return HANDLE_WM_INITDIALOG (hwnd, wParam, lParam, Dialog_OnInitDialog);   
    
         case WM_TIMER:                  /*/ Notification of timer interval              /*/   
             return HANDLE_WM_TIMER (hwnd, wParam, lParam, Dialog_OnTimer);   
     }   
     return FALSE;   
 }   
    
 /*/  
 / / static void  
 / /     Dialog_OnCommand (HWND hwnd, int id, hwnd hwndCtl, UINT codeNotify)  
 / /  
 / /         hwnd        Window handle for the dialog box window  
 / /         id          Specifies the identifier of the menu item, control, or accelerator.  
 / /         hwndCtl     Handle of the control sending the message if the message  
 / /                     is from a control, otherwise, this parameter is NULL.   
 / /         codeNotify  Specifies the notification code if the message is from a control.  
 / /                     This parameter is 1 when the message is from an accelerator.  
 / /                     This parameter is 0 when the message is from a menu.  
 / /  
 / / PURPOSE:  
 / /     Handle the keyboard and control notifications.  
 / /     An OK button press, or Enter/Esc keypress  
 / /     all dismiss the Colorz dialog box.  
 /*/   
    
 static void   
 Dialog_OnCommand (HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)   
 {   
     /*/ The macros used here are defined in windowx.h /*/   
    
     switch (id)   
     {   
         case IDC_CHECK_GRAYSCL:   
             if(Button_GetCheck(hwndCtl)==BST_CHECKED)   
                 bGrayScale = TRUE;   
             else   
                 bGrayScale = FALSE;   
             break;   
    
         case IDC_CHECK_ONTOP:   
             if(Button_GetCheck(hwndCtl)==BST_CHECKED)   
             {   
                 bOnTop = TRUE;   
                 /*/ set the Colorz dialog on top of others /*/   
                 SetWindowPos(hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);   
             }   
             else   
             {   
                 bOnTop = FALSE;   
                 /*/ restore the Colorz dialog /*/   
                 SetWindowPos(hwnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);   
             }   
             break;   
    
         case IDC_CHECK_GRABCLR:   
             GrabColor (hwnd, hwndCtl);   
             break;   
    
         case IDC_RADIO_BACKGND:   
             bBackground = TRUE;   
             /*/ update scroll bars to reflect selected color /*/   
             ScrollBar_SetPos(GetDlgItem(hwnd,IDC_SCROLLBAR_R),GetRValue(cBackground),TRUE);   
             ScrollBar_SetPos(GetDlgItem(hwnd,IDC_SCROLLBAR_G),GetGValue(cBackground),TRUE);   
             ScrollBar_SetPos(GetDlgItem(hwnd,IDC_SCROLLBAR_B),GetBValue(cBackground),TRUE);   
    
             /*/ display output /*/   
             UpdateDisplay(hwnd, GetDlgItem(hwnd,IDC_STATIC_RGB),GetDlgItem(hwnd,IDC_STATIC_HEX),   
                             GetRValue(cBackground),GetGValue(cBackground),GetBValue(cBackground));   
             break;   
    
         case IDC_RADIO_FOREGND:   
             bBackground = FALSE;   
             /*/ update scroll bars to reflect selected color /*/   
             ScrollBar_SetPos(GetDlgItem(hwnd,IDC_SCROLLBAR_R),GetRValue(cForeground),TRUE);   
             ScrollBar_SetPos(GetDlgItem(hwnd,IDC_SCROLLBAR_G),GetGValue(cForeground),TRUE);   
             ScrollBar_SetPos(GetDlgItem(hwnd,IDC_SCROLLBAR_B),GetBValue(cForeground),TRUE);   
    
             /*/ display output /*/   
             UpdateDisplay(hwnd, GetDlgItem(hwnd,IDC_STATIC_RGB),GetDlgItem(hwnd,IDC_STATIC_HEX),   
                             GetRValue(cForeground),GetGValue(cForeground),GetBValue(cForeground));   
             break;   
    
         case IDC_RADIO_OFF:   
             iCopyMode = 0;   
             /*/ force controls to repaint /*/   
             InvalidateRgn( GetDlgItem(hwnd,IDC_STATIC_RGB) ,NULL,TRUE);   
             InvalidateRgn( GetDlgItem(hwnd,IDC_STATIC_HEX) ,NULL,TRUE);   
             break;   
    
         case IDC_RADIO_RGB:   
             iCopyMode = 1;   
             /*/ force controls to repaint /*/   
             InvalidateRgn( GetDlgItem(hwnd,IDC_STATIC_RGB) ,NULL,TRUE);   
             InvalidateRgn( GetDlgItem(hwnd,IDC_STATIC_HEX) ,NULL,TRUE);   
             break;   
    
         case IDC_RADIO_HEX:   
             iCopyMode = 2;   
             /*/ force controls to repaint /*/   
             InvalidateRgn( GetDlgItem(hwnd,IDC_STATIC_RGB) ,NULL,TRUE);   
             InvalidateRgn( GetDlgItem(hwnd,IDC_STATIC_HEX) ,NULL,TRUE);   
             break;   
    
         case IDCANCEL:   
             if(hBackGrnd) DeleteObject(hBackGrnd);  /*/ Clean Up                      /*/   
             EndDialog (hwnd, TRUE);                 /*/ Dismiss the Colorz dialog box /*/   
             break;   
     }   
    
     /*/ This prevents 'unreferenced formal parameter' warnings /*/   
     codeNotify;   
 }   
    
 /*/  
 / / HBRUSH  
 / /     Dialog_OnCtlColorStatic (HWND hwnd, HDC hdc, HWND hChild, int type)  
 / /  
 / /         hwnd    Window handle for the dialog box window  
 / /         hdc     Handle to device context for static control  
 / /         hChild  Window handle for the static control  
 / /         type    HOWDY  
 / /  
 / / PURPOSE:  
 / /     Determines the colors of a static control.  
 /*/   
    
 HBRUSH   
 Dialog_OnCtlColorStatic (HWND hwnd, HDC hdc, HWND hChild, int type)   
 {   
     /*/ This prevents 'unreferenced formal parameter' warnings /*/   
     type;   
    
     /*/ The macros used here are defined in windowx.h /*/   
    
     if (hChild==GetDlgItem(hwnd,IDC_STATIC_PREVIEW))   
     {   
         if(hBackGrnd) DeleteObject(hBackGrnd);   
         hBackGrnd = CreateSolidBrush(cBackground);   
         SetBkMode(hdc,TRANSPARENT);   
         SetTextColor(hdc,cForeground);   
         return hBackGrnd;   
     }   
     if (hChild==GetDlgItem(hwnd,IDC_STATIC_RGB))   
     {   
         if(hBackGrnd) DeleteObject(hBackGrnd);   
         hBackGrnd = CreateSolidBrush( GetSysColor(COLOR_3DFACE) );   
         SetBkMode(hdc,TRANSPARENT);   
    
         if(iCopyMode==1)   
             SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHT) );   
         else   
             SetTextColor(hdc, GetSysColor(COLOR_BTNTEXT) );   
    
         return hBackGrnd;   
     }   
     if (hChild==GetDlgItem(hwnd,IDC_STATIC_HEX))   
     {   
         if(hBackGrnd) DeleteObject(hBackGrnd);   
         hBackGrnd = CreateSolidBrush( GetSysColor(COLOR_3DFACE) );   
         SetBkMode(hdc,TRANSPARENT);   
    
         if(iCopyMode==2)   
             SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHT) );   
         else   
             SetTextColor(hdc, GetSysColor(COLOR_BTNTEXT) );   
    
         return hBackGrnd;   
     }   
     else   
         return FORWARD_WM_CTLCOLORSTATIC(hwnd, hdc, hChild, DefWindowProc);   
 }   
    
 /*/  
 / / static void  
 / /     Dialog_OnHScroll (HWND hwnd, HWND hctl, UINT code, int pos)  
 / /  
 / /         hwnd    Window handle for the dialog box window  
 / /         hctl    Handle of the control sending the message  
 / /         code    Specifies the notification code if the message is from a control.  
 / /         pos     Position user moved the scroll bar to  
 / /  
 / / PURPOSE:  
 / /     Handle the scroll bar notifications.  
 / /     and update the other controls as needed.  
 /*/   
    
 static void   
 Dialog_OnHScroll (HWND hwnd, HWND hctl, UINT code, int pos)   
 {   
     HWND hPreview;  /*/ used to reference current control /*/   
     HWND hR,hG,hB;   
     HWND hStatusRGB, hStatusHex;   
    
     int posx;       /*/ used to track current position    /*/   
     int R,G,B;      /*/ used to set global variables      /*/   
    
     hR = GetDlgItem(hwnd,IDC_SCROLLBAR_R);   
     hG = GetDlgItem(hwnd,IDC_SCROLLBAR_G);   
     hB = GetDlgItem(hwnd,IDC_SCROLLBAR_B);   
    
     switch(code)   
     {   
         /*/ The macros used here are defined in windowx.h /*/   
    
         /*/  
         / / This code handles common notifications from the scroll bars  
         / / and if the user wants to keep his/her values in grayscale, it  
         / / makes sure the bars are in uniform. (same value for all)  
         /*/   
    
         case SB_THUMBPOSITION:      /*/ user releases thumb         /*/   
             if(bGrayScale)          /*/ see if grayscale is checked /*/   
             {   
                 ScrollBar_SetPos(hR,pos,TRUE);   
                 ScrollBar_SetPos(hG,pos,TRUE);   
                 ScrollBar_SetPos(hB,pos,TRUE);   
             }   
             else   
                 ScrollBar_SetPos(hctl,pos,TRUE);   
             break;   
    
         case SB_THUMBTRACK:         /*/ user drags thumb            /*/   
             if(bGrayScale)          /*/ see if grayscale is checked /*/   
             {   
                 ScrollBar_SetPos(hR,pos,TRUE);   
                 ScrollBar_SetPos(hG,pos,TRUE);   
                 ScrollBar_SetPos(hB,pos,TRUE);   
             }   
             else   
                 ScrollBar_SetPos(hctl,pos,TRUE);   
             break;   
    
         case SB_LINERIGHT:          /*/ user clicks right arrow     /*/   
             posx = ScrollBar_GetPos(hctl);   
             posx += 1;   
             if(bGrayScale)          /*/ see if grayscale is checked /*/   
             {   
                 ScrollBar_SetPos(hR,posx,TRUE);   
                 ScrollBar_SetPos(hG,posx,TRUE);   
                 ScrollBar_SetPos(hB,posx,TRUE);   
             }   
             else   
                 ScrollBar_SetPos(hctl,posx,TRUE);   
             break;   
                
         case SB_LINELEFT:           /*/ user clicks left arrow      /*/   
             posx = ScrollBar_GetPos(hctl);   
             posx -= 1;   
             if(bGrayScale)          /*/ see if grayscale is checked /*/   
             {   
                 ScrollBar_SetPos(hR,posx,TRUE);   
                 ScrollBar_SetPos(hG,posx,TRUE);   
                 ScrollBar_SetPos(hB,posx,TRUE);   
             }   
             else   
                 ScrollBar_SetPos(hctl,posx,TRUE);   
             break;   
    
         case SB_PAGERIGHT:          /*/ user pages right            /*/   
             posx = ScrollBar_GetPos(hctl);   
             posx += 5;   
             if(bGrayScale)          /*/ see if grayscale is checked /*/   
             {   
                 ScrollBar_SetPos(hR,posx,TRUE);   
                 ScrollBar_SetPos(hG,posx,TRUE);   
                 ScrollBar_SetPos(hB,posx,TRUE);   
             }   
             else   
                 ScrollBar_SetPos(hctl,posx,TRUE);   
             break;   
    
         case SB_PAGELEFT:           /*/ user pages left             /*/   
             posx = ScrollBar_GetPos(hctl);   
             posx -= 5;   
             if(bGrayScale)          /*/ see if grayscale is checked /*/   
             {   
                 ScrollBar_SetPos(hR,posx,TRUE);   
                 ScrollBar_SetPos(hG,posx,TRUE);   
                 ScrollBar_SetPos(hB,posx,TRUE);   
             }   
             else   
                 ScrollBar_SetPos(hctl,posx,TRUE);   
             break;   
     }   
    
     /*/ set IDC_PREVIEW to match the new values /*/   
     R = ScrollBar_GetPos(hR);   
     G = ScrollBar_GetPos(hG);   
     B = ScrollBar_GetPos(hB);   
    
     hPreview   = GetDlgItem(hwnd,IDC_STATIC_PREVIEW);   
     hStatusRGB = GetDlgItem(hwnd,IDC_STATIC_RGB);   
     hStatusHex = GetDlgItem(hwnd,IDC_STATIC_HEX);   
    
     /*/ update display and variables /*/   
     UpdateDisplay(hwnd, hStatusRGB, hStatusHex, R, G, B);   
    
     /*/ force control to repaint itself /*/   
     InvalidateRgn(hPreview,NULL,TRUE);   
 }   
    
 /*/  
 / / static BOOL  
 / /     Dialog_OnInitDialog (HWND hwnd, HWND hwndFocus, LPARAM lParam)  
 / /  
 / / PURPOSE:  
 / /     Function to handle any initialization necessary before  
 / /     the newly created window is shown.  
 /*/   
    
 static BOOL   
 Dialog_OnInitDialog (HWND hwnd, HWND hwndFocus, LPARAM lParam)   
 {   
     HFONT hFont;   
     HICON hIcon;   
     SCROLLINFO si;   
     HINSTANCE hInst;   
    
     /*/ Center the main window in the work area. /*/   
     CenterWnd(hwnd,NULL);   
    
     /*/ The macros used here are defined in windowx.h /*/   
    
     hInst = GetWindowInstance(hwnd);   
    
     /*/ Get a handle to the System font /*/   
     hFont = CreateFont(   
         10,0,0,0,FW_NORMAL,0,0,0,   
         ANSI_CHARSET,OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,   
         FF_SWISS,"System");   
    
     /*/ set the preview pane's font /*/   
     SetWindowFont(GetDlgItem(hwnd,IDC_STATIC_PREVIEW),hFont,TRUE);   
    
     /*/ we are done with the font /*/   
     DeleteObject(hFont);   
    
     /*/ ***** INITIALIZATION ROUTINES ***** /*/   
    
     /*/ values for the R, G, and B scrollbars /*/   
    
     si.cbSize = sizeof(si);   
     si.nMin = 0;            /*/ Minimum value /*/   
     si.nMax = 255;          /*/ Maximum value /*/   
     si.fMask = SIF_RANGE;   /*/ Flag to indicate that want to manipulate ranges /*/   
    
     /*/ apply the data to the scroll bars /*/   
     SetScrollInfo(GetDlgItem(hwnd,IDC_SCROLLBAR_R),SB_CTL,&si,TRUE);   
     SetScrollInfo(GetDlgItem(hwnd,IDC_SCROLLBAR_G),SB_CTL,&si,TRUE);   
     SetScrollInfo(GetDlgItem(hwnd,IDC_SCROLLBAR_B),SB_CTL,&si,TRUE);   
    
     /*/  
     / / The Button_SetCheck macro is defined in Windowsx.h.  If you do not  
     / / include the header, you'll have to use the SendMessage API directly.  
     /*/   
    
     Button_SetCheck(GetDlgItem(hwnd, IDC_RADIO_BACKGND), BM_SETCHECK);   
     Button_SetCheck(GetDlgItem(hwnd, IDC_RADIO_OFF), BM_SETCHECK);   
    
     /*/  
     / / Use our custom icon for the dialog instead of the Windows'  
     / / default icon on the title bar (and when using Alt+Tab)  
     /*/   
    
     hIcon = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDR_MAINFRAME),   
                             IMAGE_ICON,   
                             GetSystemMetrics(SM_CXICON),   
                             GetSystemMetrics(SM_CYICON),   
                             LR_DEFAULTCOLOR);   
    
     SendMessage(hwnd, WM_SETICON, (WPARAM)ICON_BIG, (LPARAM)hIcon);   
    
     hIcon = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDR_MAINFRAME),   
                             IMAGE_ICON,   
                             GetSystemMetrics(SM_CXSMICON),   
                             GetSystemMetrics(SM_CYSMICON),   
                             LR_DEFAULTCOLOR);   
    
     SendMessage(hwnd, WM_SETICON, (WPARAM)ICON_SMALL, (LPARAM)hIcon);   
    
     /*/ These prevent 'unreferenced formal parameter' warnings /*/   
     hwndFocus;   
     lParam;   
    
     return TRUE;   
 }   
    
 /*/  
 / / void  
 / /     Dialog_OnTimer (HWND hwnd, UINT id)  
 / /  
 / /         hwnd        Window handle for the dialog box window  
 / /         id          Specifies the identifier of the timer  
 / /  
 / / PURPOSE:  
 / /     Receives timer notifications.  
 /*/   
    
 void   
 Dialog_OnTimer (HWND hwnd, UINT id)   
 {   
     /*/ The macros used here are defined in windowx.h /*/   
    
     static POINT spoint;   
     POINT cursor;   
     HDC hdc, hdcPrev;   
     HWND hwndxy, hPreview;   
     HWND hStatusRGB,hStatusHex;   
     int R,G,B, AltKey;   
     COLORREF rgb;   
    
     /*/ is the user pressing either ALT key? /*/   
     AltKey = GetAsyncKeyState(VK_MENU);   
     /*/ key isn't being pressed, so get out /*/   
     if(AltKey==0) return;   
    
     /*/ ***** GRAB COLOR PROCESS ***** /*/   
    
     GetCursorPos(&cursor);   
    
     if(cursor.x==spoint.x && cursor.y==spoint.y) return;   
    
     spoint.x = cursor.x;   
     spoint.y = cursor.y;   
    
     /*/ get a handle to the window under the cursor /*/   
     hwndxy = WindowFromPoint(spoint);   
    
     /*/ get a handle to the window for IDC_STATIC_PREVIEW /*/   
     hPreview = GetDlgItem(hwnd,IDC_STATIC_PREVIEW);   
    
     /*/ get handles to both of the windows' DCs /*/   
     hdc =       GetDC(hwndxy);   
     hdcPrev =   GetDC(hPreview);   
    
     /*/ GetPixel requires client coordinates /*/   
     ScreenToClient(hwndxy,&cursor);   
     rgb = GetPixel(hdc,cursor.x,cursor.y);   
    
     /*/  
     / / The following is a workaround for the GetPixel API. If the  
     / / cursor is over a titlebar or other non-client areas of the  
     / / window it'll return -1 for the RGB intensities. In this case  
     / / we use BitBlt to copy the color to our control and extract  
     / / the the intensities from that.  
     /*/   
    
     if(rgb==-1)     /*/ check to see if intensities are valid /*/   
     {   
         BitBlt(hdcPrev,0,0,1,1,hdc,cursor.x,cursor.y,SRCCOPY);   
         rgb = GetPixel(hdcPrev,0,0);   
     }   
    
     /*/ we no longer need the handles, so we discard them /*/   
     ReleaseDC(hwndxy,hdc);   
     ReleaseDC(hPreview,hdcPrev);   
    
     /*/ retreive specific color intensities /*/   
    
     /*/ GetXValue macros are defined in windowx.h /*/   
     R = GetRValue(rgb);   
     G = GetGValue(rgb);   
     B = GetBValue(rgb);   
    
     /*/ get a handle to the output static controls /*/   
     hStatusRGB = GetDlgItem(hwnd,IDC_STATIC_RGB);   
     hStatusHex = GetDlgItem(hwnd,IDC_STATIC_HEX);   
    
     /*/ display output /*/   
     UpdateDisplay(hwnd, hStatusRGB, hStatusHex, R, G, B);   
    
     /*/ force control to repaint itself /*/   
     InvalidateRgn(hPreview,NULL,TRUE);   
    
     /*/ This prevents 'unreferenced formal parameter' warnings /*/   
     id;   
 }   
    
 /*/  
 / / void  
 / /     GrabColor (HWND hwnd, HWND hwndCtl)  
 / /  
 / /         hwnd        Window handle for the dialog box window  
 / /         hwndCtl     Window handle for the preview pane control  
 / /  
 / / PURPOSE:  
 / /     Initialize and prepares for the grab color  
 / /     process to begin  
 /*/   
    
 void   
 GrabColor (HWND hwnd, HWND hwndCtl)   
 {   
     /*/ The macros used here are defined in windowx.h /*/   
        
     BOOL bGrabColor;    /*/ temp flag /*/   
     HWND hwndOnTop, hwndGrayScale;   
     HWND hwndR,hwndG,hwndB;   
    
     hwndOnTop = GetDlgItem (hwnd,IDC_CHECK_ONTOP);   
     hwndGrayScale = GetDlgItem (hwnd, IDC_CHECK_GRAYSCL);   
     hwndR = GetDlgItem (hwnd, IDC_SCROLLBAR_R);   
     hwndG = GetDlgItem (hwnd, IDC_SCROLLBAR_G);   
     hwndB = GetDlgItem (hwnd, IDC_SCROLLBAR_B);   
    
     /*/ query state of the "Grab Color" checkbox and respond accordingly /*/   
     if(Button_GetCheck(hwndCtl)==BST_CHECKED) bGrabColor = TRUE; else bGrabColor = FALSE;   
    
     /*/  
     / / The following will check and uncheck the appropriate controls  
     / / and start and end the grab color process.  
     /*/   
    
     if(bGrabColor)   
     {   
         /*/ initiate process /*/   
         Button_SetCheck(hwndOnTop,BST_CHECKED);   
         Button_SetCheck(hwndGrayScale,BST_UNCHECKED);   
         Button_Enable(hwndOnTop,FALSE);   
         Button_Enable(hwndGrayScale,FALSE);   
         SetWindowPos(hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);   
         ScrollBar_Enable(hwndR,ESB_DISABLE_BOTH);   
         ScrollBar_Enable(hwndG,ESB_DISABLE_BOTH);   
         ScrollBar_Enable(hwndB,ESB_DISABLE_BOTH);   
    
         /*/  
         / / The timer is set to trigger every 55 milliseconds. It is  
         / / pointless to set it any faster for this application because  
         / / due to hardeware timers' limitations you'll never get a  
         / / message in under a 54.925 millsecond interval (without MM,  
         / / ASM, or QueryPerformanceCounter workarounds). Accuracy is  
         / / not imperative here, so we don't care.  
         /*/   
    
         SetTimer(hwnd,ID_TIMER,55,NULL);   
     }   
     else   
     {   
         int R,G,B;   
    
         /*/ terminate process /*/   
         Button_Enable(hwndOnTop,TRUE);   
         Button_Enable(hwndGrayScale,TRUE);   
         ScrollBar_Enable(hwndR,ESB_ENABLE_BOTH);   
         ScrollBar_Enable(hwndG,ESB_ENABLE_BOTH);   
         ScrollBar_Enable(hwndB,ESB_ENABLE_BOTH);   
    
         KillTimer(hwnd,ID_TIMER);   
    
         if(bOnTop)   
         {   
             Button_SetCheck(hwndOnTop,BST_CHECKED);   
             SetWindowPos(hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);   
         }   
         else   
         {   
             Button_SetCheck(hwndOnTop,BST_UNCHECKED);   
             SetWindowPos(hwnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);   
         }   
    
         if(bGrayScale)   
             Button_SetCheck(hwndGrayScale,BST_CHECKED);   
         else   
             Button_SetCheck(hwndGrayScale,BST_UNCHECKED);   
    
         /*/ do we need the current foreground or background color? /*/   
         if(bBackground)   
         {   
             /*/ GetXValue macros are defined in windowx.h /*/   
             R = GetRValue(cBackground);   
             G = GetGValue(cBackground);   
             B = GetBValue(cBackground);   
         }   
         else   
         {   
             /*/ GetXValue macros are defined in windowx.h /*/   
             R = GetRValue(cForeground);   
             G = GetGValue(cForeground);   
             B = GetBValue(cForeground);   
    
         }   
    
         /*/ update scroll bars to reflect selected color /*/   
         ScrollBar_SetPos(hwndR,R,TRUE);   
         ScrollBar_SetPos(hwndG,G,TRUE);   
         ScrollBar_SetPos(hwndB,B,TRUE);   
     }   
    
 }   
    
 void   
 UpdateDisplay (HWND hwnd, HWND hStatusRGB, HWND hStatusHex, int R, int G, int B)   
 {   
     char StatusRGB[20];   
     char StatusHex[20];   
    
     /*/ format the RGB output for display /*/   
     wsprintf(StatusRGB,"RGB: %d,%d,%d",R,G,B);   
    
     /*/ format the Hexadecimal output for display /*/   
     if(R<16 && G<16 && B<16)   
         wsprintf(StatusHex,"Hex: 0%X0%X0%X",R,G,B);   
     else if(R<16 && G<16)   
         wsprintf(StatusHex,"Hex: 0%X0%X%X",R,G,B);   
     else if(R<16 && B<16)   
         wsprintf(StatusHex,"Hex: 0%X%X0%X",R,G,B);   
     else if(G<16 && B<16)   
         wsprintf(StatusHex,"Hex: %X0%X0%X",R,G,B);   
     else if(R<16)   
         wsprintf(StatusHex,"Hex: 0%X%X%X",R,G,B);   
     else if(G<16)   
         wsprintf(StatusHex,"Hex: %X0%X%X",R,G,B);   
     else if(B<16)   
         wsprintf(StatusHex,"Hex: %X%X0%X",R,G,B);   
     else   
         wsprintf(StatusHex,"Hex: %X%X%X",R,G,B);   
    
     /*/ update labels with new data /*/   
     SetWindowText(hStatusRGB,StatusRGB);   
     SetWindowText(hStatusHex,StatusHex);   
    
     /*/ post data to clipboard (if selected) /*/   
     if(iCopyMode == 1)   
         /*/ Advance pointer by 5 to clip 'RGB: ' /*/   
         AddClipboardText(hwnd,StatusRGB+5);   
     else if(iCopyMode == 2)   
         /*/ Advance pointer by 5 to clip 'Hex: ' /*/   
         AddClipboardText(hwnd,StatusHex+5);   
    
     if(bBackground)   
         /*/ set the background color of the static control /*/   
         cBackground = RGB(R,G,B);   
     else   
         /*/ set the foreground color of the static control /*/   
         cForeground = RGB(R,G,B);   
 } 

0 请登录后投票
   发表时间:2009-11-12  
在win上要是不嫌界面不好看的话,可以试试gtk这玩意儿,我觉得这东东写些简单的程序用glade生成xml还是比较方便的。
0 请登录后投票
   发表时间:2009-11-12  
折腾加自虐。
0 请登录后投票
   发表时间:2009-11-13  
ray_linn 写道
mikeandmore 写道
lz投奔linux吧。。。。



你在耍小白么?诸如wchar是C++标准中的unicode字符,你就是滚到linux里也是如此.GCC gui的能力弱得要死.
另外有一些是windows api的,你不调用Windows API,何必关注?



LZ到底是要从C写GUI界面,还是用C++写GUI界面? 以我看来,你还是放弃想用C写界面的想法吧:一个什么都不做的Windows界面,用C大概要300多行,你自己要去处理所有的消息。。


用MFC创建个界面,那不是相当简单的么?何至于那么难哈?



涨见识了啊。gcc和gui能联系到一起。。。。真是搞笑。。。

再说wchar_t也不只是C++标准,见C99标准7.24节
0 请登录后投票
   发表时间:2009-11-13  
七猫 写道
在win上要是不嫌界面不好看的话,可以试试gtk<script type="text/javascript" src="http://www.iteye.com/javascripts/tinymce/themes/advanced/langs/zh.js"></script><script type="text/javascript" src="http://www.iteye.com/javascripts/tinymce/plugins/javaeye/langs/zh.js"></script>这玩意儿,我觉得这东东写些简单的程序用glade生成xml还是比较方便的。

非得在win下么,gtk这东西在linux下非常方便的,glade随便拖拖,生成一个gtkbuilder的xml,然后直接加载就好了。。。
0 请登录后投票
   发表时间:2009-11-13   最后修改:2009-11-13
于是给lz个sample。顺便来反驳一下C写UI是绝对恶心的观点。

#include <gtk/gtk.h>

static void
btn_clicked(GtkButton* wid, gpointer user_data)
{
    GtkWidget* dlg = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL,
                                            GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
                                            "Hello World!");
    gtk_dialog_run(GTK_DIALOG(dlg));
    gtk_widget_destroy(dlg);
}

int 
main(int argc, char* argv[])
{
    gtk_init(&argc, &argv);
    GtkWidget* win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    GtkWidget* btn = gtk_button_new_with_label("click me");
    g_signal_connect(btn, "clicked", G_CALLBACK(btn_clicked), NULL);
    gtk_container_add(GTK_CONTAINER(win), btn);
    gtk_widget_show_all(win);
    
    gtk_main();
    return 0;
}

一共25行
0 请登录后投票
   发表时间:2009-11-13  
mikeandmore 写道
于是给lz个sample。顺便来反驳一下C写UI是绝对恶心的观点。

#include <gtk/gtk.h>

static void
btn_clicked(GtkButton* wid, gpointer user_data)
{
    GtkWidget* dlg = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL,
                                            GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
                                            "Hello World!");
    gtk_dialog_run(GTK_DIALOG(dlg));
    gtk_widget_destroy(dlg);
}

int 
main(int argc, char* argv[])
{
    gtk_init(&argc, &argv);
    GtkWidget* win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    GtkWidget* btn = gtk_button_new_with_label("click me");
    g_signal_connect(btn, "clicked", G_CALLBACK(btn_clicked), NULL);
    gtk_container_add(GTK_CONTAINER(win), btn);
    gtk_widget_show_all(win);
    
    gtk_main();
    return 0;
}

一共25行


嘿,你用一个公用库来包装一切当然简单,无非是别人帮你处理了消息处理,你自己用C写写看吧,如果GTK可用,那QT和MFC不是一样么。

楼主是想用C+Win32 API来写,你明白不?
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics