Some TODO resolution and expository comments.
This commit is contained in:
parent
28656fc3d0
commit
efc5e9c801
|
@ -55,3 +55,43 @@ void uiFreeText(char *text)
|
||||||
{
|
{
|
||||||
uiFree(text);
|
uiFree(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
intmax_t uiWindowsWindowTextWidth(HWND hwnd)
|
||||||
|
{
|
||||||
|
LRESULT len;
|
||||||
|
WCHAR *text;
|
||||||
|
HDC dc;
|
||||||
|
HFONT prevfont;
|
||||||
|
SIZE size;
|
||||||
|
|
||||||
|
size.cx = 0;
|
||||||
|
size.cy = 0;
|
||||||
|
|
||||||
|
// first we need the window text
|
||||||
|
// this copies what windowText() does because we need the len
|
||||||
|
// we could replace this with a call to windowText() but then we'd also need a call to wcslen() (or some other function that both this and windowText() would call to do the real work)
|
||||||
|
len = SendMessageW(hwnd, WM_GETTEXTLENGTH, 0, 0);
|
||||||
|
if (len == 0) // no text; nothing to do
|
||||||
|
return 0;
|
||||||
|
text = (WCHAR *) uiAlloc((len + 1) * sizeof (WCHAR), "WCHAR[]");
|
||||||
|
// note the comparison: the size includes the null terminator, but the return does not
|
||||||
|
if (GetWindowText(hwnd, text, len + 1) != len)
|
||||||
|
logLastError("error getting window text in uiWindowsWindowTextWidth()");
|
||||||
|
|
||||||
|
// now we can do the calculations
|
||||||
|
dc = GetDC(hwnd);
|
||||||
|
if (dc == NULL)
|
||||||
|
logLastError("error getting DC in uiWindowsWindowTextWidth()");
|
||||||
|
prevfont = (HFONT) SelectObject(dc, hMessageFont);
|
||||||
|
if (prevfont == NULL)
|
||||||
|
logLastError("error loading control font into device context in uiWindowsWindowTextWidth()");
|
||||||
|
if (GetTextExtentPoint32W(dc, text, len, &size) == 0)
|
||||||
|
logLastError("error getting text extent point in uiWindowsWindowTextWidth()");
|
||||||
|
if (SelectObject(dc, prevfont) != hMessageFont)
|
||||||
|
logLastError("error restoring previous font into device context in uiWindowsWindowTextWidth()");
|
||||||
|
if (ReleaseDC(hwnd, dc) == 0)
|
||||||
|
logLastError("error releasing DC in uiWindowsWindowTextWidth()");
|
||||||
|
uiFree(text);
|
||||||
|
|
||||||
|
return size.cx;
|
||||||
|
}
|
||||||
|
|
|
@ -1,45 +1,6 @@
|
||||||
// 6 april 2015
|
// 6 april 2015
|
||||||
#include "uipriv_windows.h"
|
#include "uipriv_windows.h"
|
||||||
|
|
||||||
// TODO move to text.c
|
|
||||||
intmax_t uiWindowsWindowTextWidth(HWND hwnd)
|
|
||||||
{
|
|
||||||
LRESULT len;
|
|
||||||
WCHAR *text;
|
|
||||||
HDC dc;
|
|
||||||
HFONT prevfont;
|
|
||||||
SIZE size;
|
|
||||||
|
|
||||||
size.cx = 0;
|
|
||||||
size.cy = 0;
|
|
||||||
|
|
||||||
// first we need the window text
|
|
||||||
len = SendMessageW(hwnd, WM_GETTEXTLENGTH, 0, 0);
|
|
||||||
if (len == 0) // no text; nothing to do
|
|
||||||
return 0;
|
|
||||||
text = (WCHAR *) uiAlloc((len + 1) * sizeof (WCHAR), "WCHAR[]");
|
|
||||||
// note the comparison: the size includes the null terminator, but the return does not
|
|
||||||
if (GetWindowText(hwnd, text, len + 1) != len)
|
|
||||||
logLastError("error getting window text in uiWindowsWindowTextWidth()");
|
|
||||||
|
|
||||||
// now we can do the calculations
|
|
||||||
dc = GetDC(hwnd);
|
|
||||||
if (dc == NULL)
|
|
||||||
logLastError("error getting DC in uiWindowsWindowTextWidth()");
|
|
||||||
prevfont = (HFONT) SelectObject(dc, hMessageFont);
|
|
||||||
if (prevfont == NULL)
|
|
||||||
logLastError("error loading control font into device context in uiWindowsWindowTextWidth()");
|
|
||||||
if (GetTextExtentPoint32W(dc, text, len, &size) == 0)
|
|
||||||
logLastError("error getting text extent point in uiWindowsWindowTextWidth()");
|
|
||||||
if (SelectObject(dc, prevfont) != hMessageFont)
|
|
||||||
logLastError("error restoring previous font into device context in uiWindowsWindowTextWidth()");
|
|
||||||
if (ReleaseDC(hwnd, dc) == 0)
|
|
||||||
logLastError("error releasing DC in uiWindowsWindowTextWidth()");
|
|
||||||
uiFree(text);
|
|
||||||
|
|
||||||
return size.cx;
|
|
||||||
}
|
|
||||||
|
|
||||||
// this is a helper function that takes the logic of determining window classes and puts it all in one place
|
// this is a helper function that takes the logic of determining window classes and puts it all in one place
|
||||||
// there are a number of places where we need to know what window class an arbitrary handle has
|
// there are a number of places where we need to know what window class an arbitrary handle has
|
||||||
// theoretically we could use the class atom to avoid a _wcsicmp()
|
// theoretically we could use the class atom to avoid a _wcsicmp()
|
||||||
|
|
Loading…
Reference in New Issue