GetCharWidth, GetCharWidth32, GetCharWidthFloat
调查字体中一个或多个字符的宽度。在Win32环境中,请使用GetCharWidth32函数。用GetCharWidthFloat则可获得小数宽度 
返回值 找了好久只有定义和其他语言的例子那位能给一个在vb中使用的例子啊
多谢多谢啊!!!!

解决方案 »

  1.   

    VB声明 
    Declare Function GetCharWidth& Lib "gdi32" Alias "GetCharWidthA" (ByVal hDC As Long, ByVal iFirstChar As Long, ByVal iLastChar As Long, lpBuffer As Long)
    Declare Function GetCharWidth32& Lib "gdi32" Alias "GetCharWidth32A" (ByVal hdc As Long, ByVal iFirstChar As Long, ByVal iLastChar As Long, lpBuffer As Long)
    Declare Function GetCharWidthFloat& Lib "gdi32" Alias "GetCharWidthFloatA" (ByVal hdc As Long, ByVal iFirstChar As Long, ByVal iLastChar As Long, pxBuffer As Single) 
    说明 
    调查字体中一个或多个字符的宽度。
    正在装载数据…… 
    在Win32环境中,请使用GetCharWidth32函数。用GetCharWidthFloat则可获得小数宽度 
    返回值 
    Long,非零表示成功,零表示失败。会设置GetLastError 
    参数表 
    参数 类型及说明 
    hDC Long,设备场景的句柄 
    iFirstChar Long,要调查宽度的第一个字符的ASCII值 
    iLastChar Long,要调查宽度的最后一个字符的ASCII值 
    lpBuffer Long,指定Long值数组的第一个条目。该数组容纳了字体的字符宽度设置 
    pxBuffer Single,指定Single值数组的第一个条目。该数组容纳了字体的字符宽度设置 
    注解 
    对于TureType字体,GetCharABCWidths可获得更详细的信息
     文章转载自『幽月's Blog』地址: http://a1l.cn/article.asp?id=17808
      

  2.   

    这个更祥细:
    http://i.mop.com/shandashu/blog/2008/01/24/6119423.html
      

  3.   

    例子不好找!只找到一个VC++的:#define BUFSIZE 65535 
    #define SHIFTED 0x8000 LONG APIENTRY MainWndProc(HWND hwndMain, UINT uMsg, WPARAM wParam, LPARAM lParam) 

        HDC hdc;                   // handle to device context 
        TEXTMETRIC tm;             // structure for text metrics 
        static DWORD dwCharX;      // average width of characters 
        static DWORD dwCharY;      // height of characters 
        static DWORD dwClientX;    // width of client area 
        static DWORD dwClientY;    // height of client area 
        static DWORD dwLineLen;    // line length 
        static DWORD dwLines;      // text lines in client area 
        static int nCaretPosX = 0; // horizontal position of caret 
        static int nCaretPosY = 0; // vertical position of caret 
        static int nCharWidth = 0; // width of a character 
        static int cch = 0;        // characters in buffer 
        static int nCurChar = 0;   // index of current character 
        static PTCHAR pchInputBuf; // input buffer 
        int i, j;                  // loop counters 
        int cCR = 0;               // count of carriage returns 
        int nCRIndex = 0;          // index of last carriage return 
        int nVirtKey;              // virtual-key code 
        TCHAR szBuf[128];          // temporary buffer 
        TCHAR ch;                  // current character 
        PAINTSTRUCT ps;            // required by BeginPaint 
        RECT rc;                   // output rectangle for DrawText 
        SIZE sz;                   // string dimensions 
        COLORREF crPrevText;       // previous text color 
        COLORREF crPrevBk;         // previous background color     switch (uMsg) 
        { 
            case WM_CREATE:             // Get the metrics of the current font.             hdc = GetDC(hwndMain); 
                GetTextMetrics(hdc, &tm); 
                ReleaseDC(hwndMain, hdc);             // Save the average character width and height.             dwCharX = tm.tmAveCharWidth; 
                dwCharY = tm.tmHeight;             // Allocate a buffer to store keyboard input.             pchInputBuf = (LPTSTR) GlobalAlloc(GPTR, 
                    BUFSIZE * sizeof(TCHAR)); 
                return 0;         case WM_SIZE:             // Save the new width and height of the client area.             dwClientX = LOWORD(lParam); 
                dwClientY = HIWORD(lParam);             // Calculate the maximum width of a line and the 
                // maximum number of lines in the client area. 
                
                dwLineLen = dwClientX - dwCharX; 
                dwLines = dwClientY / dwCharY; 
                break; 
            case WM_SETFOCUS:             // Create, position, and display the caret when the 
                // window receives the keyboard focus.             CreateCaret(hwndMain, (HBITMAP) 1, 0, dwCharY); 
                SetCaretPos(nCaretPosX, nCaretPosY * dwCharY); 
                ShowCaret(hwndMain); 
                break;         case WM_KILLFOCUS:             // Hide and destroy the caret when the window loses the 
                // keyboard focus.             HideCaret(hwndMain); 
                DestroyCaret(); 
                break;         case WM_CHAR: 
                switch (wParam) 
                { 
                    case 0x08:  // backspace 
                    case 0x0A:  // linefeed 
                    case 0x1B:  // escape 
                        MessageBeep((UINT) -1); 
                        return 0;                 case 0x09:  // tab                     // Convert tabs to four consecutive spaces.                     for (i = 0; i < 4; i++) 
                            SendMessage(hwndMain, WM_CHAR, 0x20, 0); 
                        return 0;                 case 0x0D:  // carriage return                     // Record the carriage return and position the 
                        // caret at the beginning of the new line.                     pchInputBuf[cch++] = 0x0D; 
                        nCaretPosX = 0; 
                        nCaretPosY += 1; 
                        break;                 default:    // displayable character                     ch = (TCHAR) wParam; 
                        HideCaret(hwndMain);                     // Retrieve the character's width and output 
                        // the character.                     hdc = GetDC(hwndMain); 
                        GetCharWidth32(hdc, (UINT) wParam, (UINT) wParam, 
                            &nCharWidth); 
                        TextOut(hdc, nCaretPosX, nCaretPosY * dwCharY, 
                            &ch, 1); 
                        ReleaseDC(hwndMain, hdc);                     // Store the character in the buffer.                     pchInputBuf[cch++] = ch;                     // Calculate the new horizontal position of the 
                        // caret. If the position exceeds the maximum, 
                        // insert a carriage return and move the caret 
                        // to the beginning of the next line.                     nCaretPosX += nCharWidth; 
                        if ((DWORD) nCaretPosX > dwLineLen) 
                        { 
                            nCaretPosX = 0; 
                            pchInputBuf[cch++] = 0x0D; 
                            ++nCaretPosY; 
                        } 
                        nCurChar = cch; 
                        ShowCaret(hwndMain); 
                        break; 
                } 
                SetCaretPos(nCaretPosX, nCaretPosY * dwCharY); 
                break;         case WM_KEYDOWN: 
                switch (wParam) 
                { 
                    case VK_LEFT:   // LEFT ARROW                     // The caret can move only to the beginning of 
                        // the current line.                     if (nCaretPosX > 0) 
                        { 
                            HideCaret(hwndMain);                         // Retrieve the character to the left of 
                            // the caret, calculate the character's 
                            // width, then subtract the width from the 
                            // current horizontal position of the caret 
                            // to obtain the new position.                         ch = pchInputBuf[--nCurChar]; 
                            hdc = GetDC(hwndMain); 
                            GetCharWidth32(hdc, ch, ch, &nCharWidth); 
                            ReleaseDC(hwndMain, hdc); 
                            nCaretPosX = max(nCaretPosX - nCharWidth, 
                                0); 
                            ShowCaret(hwndMain); 
                        } 
                        break;                 case VK_RIGHT:  // RIGHT ARROW                     // Caret moves to the right or, when a carriage 
                        // return is encountered, to the beginning of 
                        // the next line.                     if (nCurChar < cch) 
                        { 
                            HideCaret(hwndMain);                         // Retrieve the character to the right of 
                            // the caret. If it's a carriage return, 
                            // position the caret at the beginning of 
                            // the next line. 
      

  4.   

    接上页:                           ch = pchInputBuf[nCurChar]; 
                            if (ch == 0x0D) 
                            { 
                                nCaretPosX = 0; 
                                nCaretPosY++; 
                            }                         // If the character isn't a carriage 
                            // return, check to see whether the SHIFT 
                            // key is down. If it is, invert the text 
                            // colors and output the character.                         else 
                            { 
                                hdc = GetDC(hwndMain); 
                                nVirtKey = GetKeyState(VK_SHIFT); 
                                if (nVirtKey & SHIFTED) 
                                { 
                                    crPrevText = SetTextColor(hdc, 
                                        RGB(255, 255, 255)); 
                                    crPrevBk = SetBkColor(hdc, 
                                        RGB(0,0,0)); 
                                    TextOut(hdc, nCaretPosX, 
                                        nCaretPosY * dwCharY, 
                                        &ch, 1); 
                                    SetTextColor(hdc, crPrevText); 
                                    SetBkColor(hdc, crPrevBk); 
                                }                             // Get the width of the character and 
                                // calculate the new horizontal 
                                // position of the caret.                             GetCharWidth32(hdc, ch, ch, &nCharWidth); 
                                ReleaseDC(hwndMain, hdc); 
                                nCaretPosX = nCaretPosX + nCharWidth; 
                            } 
                            nCurChar++; 
                            ShowCaret(hwndMain); 
                            break; 
                        } 
                        break;                 case VK_UP:     // UP ARROW 
                    case VK_DOWN:   // DOWN ARROW 
                        MessageBeep((UINT) -1); 
                        return 0;                 case VK_HOME:   // HOME                     // Set the caret's position to the upper left 
                        // corner of the client area.                     nCaretPosX = nCaretPosY = 0; 
                        nCurChar = 0; 
                        break;                 case VK_END:    // END                      // Move the caret to the end of the text.                     for (i=0; i < cch; i++) 
                        { 
                            // Count the carriage returns and save the 
                            // index of the last one.                         if (pchInputBuf[i] == 0x0D) 
                            { 
                                cCR++; 
                                nCRIndex = i + 1; 
                            } 
                        } 
                        nCaretPosY = cCR;                     // Copy all text between the last carriage 
                        // return and the end of the keyboard input 
                        // buffer to a temporary buffer.                     for (i = nCRIndex, j = 0; i < cch; i++, j++) 
                            szBuf[j] = pchInputBuf[i]; 
                        szBuf[j] = TEXT('\0');                     // Retrieve the text extent and use it 
                        // to set the horizontal position of the 
                        // caret.                     hdc = GetDC(hwndMain); 
                        GetTextExtentPoint32(hdc, szBuf, lstrlen(szBuf), 
                            &sz); 
                        nCaretPosX = sz.cx; 
                        ReleaseDC(hwndMain, hdc); 
                        nCurChar = cch; 
                        break;                 default: 
                        break; 
                } 
                SetCaretPos(nCaretPosX, nCaretPosY * dwCharY); 
                break;         case WM_PAINT: 
                if (cch == 0)       // nothing in input buffer 
                    break;             hdc = BeginPaint(hwndMain, &ps); 
                HideCaret(hwndMain);             // Set the clipping rectangle, and then draw the text 
                // into it.             SetRect(&rc, 0, 0, dwLineLen, dwClientY); 
                DrawText(hdc, pchInputBuf, -1, &rc, DT_LEFT);             ShowCaret(hwndMain); 
                EndPaint(hwndMain, &ps); 
                break; 
            
            // Process other messages. 
            
            case WM_DESTROY: 
                PostQuitMessage(0);             // Free the input buffer.             GlobalFree((HGLOBAL) pchInputBuf); 
                UnregisterHotKey(hwndMain, 0xAAAA); 
                break;         default: 
                return DefWindowProc(hwndMain, uMsg, wParam, lParam); 
        } 
        return NULL; 

    以上是MSDN上的例子。