请教一下关于GetCharWidth在vb中使用的问题

ttsffgg 2008-04-16 07:36:59
GetCharWidth, GetCharWidth32, GetCharWidthFloat
调查字体中一个或多个字符的宽度。在Win32环境中,请使用GetCharWidth32函数。用GetCharWidthFloat则可获得小数宽度
返回值

找了好久只有定义和其他语言的例子

那位能给一个在vb中使用的例子啊
多谢多谢啊!!!!
...全文
142 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttsffgg 2008-04-18
  • 打赏
  • 举报
回复
十分感谢
看来只有耐着性子看C的代码了..
东方之珠 2008-04-17
  • 打赏
  • 举报
回复
接上页:

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上的例子。

东方之珠 2008-04-17
  • 打赏
  • 举报
回复
例子不好找!只找到一个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.


东方之珠 2008-04-17
  • 打赏
  • 举报
回复
这个更祥细:
http://i.mop.com/shandashu/blog/2008/01/24/6119423.html
东方之珠 2008-04-17
  • 打赏
  • 举报
回复
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
ttsffgg 2008-04-17
  • 打赏
  • 举报
回复
这些都有啊~~~还是不明白到底怎么用

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧