GetCharWidth, GetCharWidth32, GetCharWidthFloat
调查字体中一个或多个字符的宽度。在Win32环境中,请使用GetCharWidth32函数。用GetCharWidthFloat则可获得小数宽度
返回值 找了好久只有定义和其他语言的例子那位能给一个在vb中使用的例子啊
多谢多谢啊!!!!
调查字体中一个或多个字符的宽度。在Win32环境中,请使用GetCharWidth32函数。用GetCharWidthFloat则可获得小数宽度
返回值 找了好久只有定义和其他语言的例子那位能给一个在vb中使用的例子啊
多谢多谢啊!!!!
解决方案 »
- 有没有详细讲 脏读 不可重复读 和 虚读的概念 及 详细 事例的教材
- 高手帮我看看,VB中的这段代码在VB.NET中可以用吗?
- 本贴为fj182 阿花追加100分,原由见主贴
- 困扰我多日的MSFlexGrid问题,希望高手能指点迷津。解决问题就给分!多谢多谢!
- VB如何执行SQL语句与在Access中执行SQL语句的区别是什么???????
- 如何用独占方式打开一个文件
- 如何,在vb里实现自动生成一个文件?
- 怎样通过远程拨号访问服务器的SQL Server数据库?在服务器和客户端都要进行哪些设置及具体操作?
- 如何让程序在windows启动时运行(桌面出现前),就像windows的网络登陆对话框
- 请教:如何清空文件夹?
- 有谁知道哪个控件具有组合排序功能的大虾请进来指点
- 关于BMP文件的RGB处理?通过VB技术得到位图rgb(24位),将其全部显示为单个label的背景颜色,但组成的图形不是原来的位图样子,请给予帮组????
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
http://i.mop.com/shandashu/blog/2008/01/24/6119423.html
#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.
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上的例子。