// 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);
returnsize.cx;
}
// 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
// theoretically we could use the class atom to avoid a _wcsicmp()
// however, raymond chen advises against this - http://blogs.msdn.com/b/oldnewthing/archive/2004/10/11/240744.aspx (and we're not in control of the Tab class, before you say anything)
// MSDN says 256 is the maximum length of a class name; add a few characters just to be safe (because it doesn't say whether this includes the terminating null character)
#define maxClassName 260
WCHARclassname[maxClassName+1];
va_listap;
WCHAR*curname;
inti;
if(GetClassNameW(hwnd,classname,maxClassName)==0)
logLastError("error getting name of window class in windowClassOf()");