Windows error checking and warnings
This commit is contained in:
+93
-75
@@ -283,21 +283,22 @@ MenuWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
|
||||
HDC hdc = GetDC(control);
|
||||
data = (PNHMenuWindow) malloc(sizeof(NHMenuWindow));
|
||||
ZeroMemory(data, sizeof(NHMenuWindow));
|
||||
data->type = MENU_TYPE_TEXT;
|
||||
data->how = PICK_NONE;
|
||||
data->result = 0;
|
||||
data->done = 0;
|
||||
data->bmpChecked =
|
||||
LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_MENU_SEL));
|
||||
data->bmpCheckedCount =
|
||||
LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_MENU_SEL_COUNT));
|
||||
data->bmpNotChecked =
|
||||
LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_MENU_UNSEL));
|
||||
data->bmpDC = CreateCompatibleDC(hdc);
|
||||
data->is_active = FALSE;
|
||||
SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR) data);
|
||||
|
||||
if (data) {
|
||||
ZeroMemory(data, sizeof(NHMenuWindow));
|
||||
data->type = MENU_TYPE_TEXT;
|
||||
data->how = PICK_NONE;
|
||||
data->result = 0;
|
||||
data->done = 0;
|
||||
data->bmpChecked =
|
||||
LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_MENU_SEL));
|
||||
data->bmpCheckedCount = LoadBitmap(
|
||||
GetNHApp()->hApp, MAKEINTRESOURCE(IDB_MENU_SEL_COUNT));
|
||||
data->bmpNotChecked =
|
||||
LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_MENU_UNSEL));
|
||||
data->bmpDC = CreateCompatibleDC(hdc);
|
||||
data->is_active = FALSE;
|
||||
SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR) data);
|
||||
}
|
||||
/* set font for the text cotrol */
|
||||
cached_font * font = mswin_get_font(NHW_MENU, ATR_NONE, hdc, FALSE);
|
||||
SendMessage(control, WM_SETFONT,
|
||||
@@ -539,6 +540,7 @@ onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
||||
RECT text_rt;
|
||||
HGDIOBJ saveFont;
|
||||
HDC hdc;
|
||||
TCHAR *was;
|
||||
|
||||
if (data->type != MENU_TYPE_TEXT)
|
||||
SetMenuType(hWnd, MENU_TYPE_TEXT);
|
||||
@@ -547,12 +549,17 @@ onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
||||
text_size = strlen(msg_data->text) + 4;
|
||||
data->menui.text.text =
|
||||
(TCHAR *) malloc(text_size * sizeof(data->menui.text.text[0]));
|
||||
ZeroMemory(data->menui.text.text,
|
||||
text_size * sizeof(data->menui.text.text[0]));
|
||||
if (data->menui.text.text)
|
||||
ZeroMemory(data->menui.text.text,
|
||||
text_size * sizeof(data->menui.text.text[0]));
|
||||
} else {
|
||||
was = data->menui.text.text;
|
||||
|
||||
text_size = _tcslen(data->menui.text.text) + strlen(msg_data->text) + 4;
|
||||
data->menui.text.text = (TCHAR *) realloc(
|
||||
data->menui.text.text, text_size * sizeof(data->menui.text.text[0]));
|
||||
if (!data->menui.text.text)
|
||||
free(was); /* this is not a good situation, but not a leak either */
|
||||
}
|
||||
if (!data->menui.text.text)
|
||||
break;
|
||||
@@ -611,75 +618,86 @@ onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
||||
break;
|
||||
|
||||
if (data->menui.menu.size == data->menui.menu.allocated) {
|
||||
PNHMenuItem was = data->menui.menu.items;
|
||||
|
||||
data->menui.menu.allocated += 10;
|
||||
data->menui.menu.items = (PNHMenuItem) realloc(
|
||||
data->menui.menu.items, data->menui.menu.allocated * sizeof(NHMenuItem));
|
||||
if (!data->menui.menu.items)
|
||||
free(was);
|
||||
}
|
||||
|
||||
new_item = data->menui.menu.size;
|
||||
ZeroMemory(&data->menui.menu.items[new_item],
|
||||
sizeof(data->menui.menu.items[new_item]));
|
||||
data->menui.menu.items[new_item].glyphinfo = msg_data->glyphinfo;
|
||||
data->menui.menu.items[new_item].identifier = *msg_data->identifier;
|
||||
data->menui.menu.items[new_item].accelerator = msg_data->accelerator;
|
||||
data->menui.menu.items[new_item].group_accel = msg_data->group_accel;
|
||||
data->menui.menu.items[new_item].attr = msg_data->attr;
|
||||
data->menui.menu.items[new_item].color = msg_data->color;
|
||||
strncpy(data->menui.menu.items[new_item].str, msg_data->str,
|
||||
NHMENU_STR_SIZE);
|
||||
/* prevent & being interpreted as a mnemonic start */
|
||||
strNsubst(data->menui.menu.items[new_item].str, "&", "&&", 0);
|
||||
data->menui.menu.items[new_item].presel = msg_data->presel;
|
||||
data->menui.menu.items[new_item].itemflags = msg_data->itemflags;
|
||||
if (data->menui.menu.items) {
|
||||
new_item = data->menui.menu.size;
|
||||
ZeroMemory(&data->menui.menu.items[new_item],
|
||||
sizeof(data->menui.menu.items[new_item]));
|
||||
data->menui.menu.items[new_item].glyphinfo = msg_data->glyphinfo;
|
||||
data->menui.menu.items[new_item].identifier =
|
||||
*msg_data->identifier;
|
||||
data->menui.menu.items[new_item].accelerator =
|
||||
msg_data->accelerator;
|
||||
data->menui.menu.items[new_item].group_accel =
|
||||
msg_data->group_accel;
|
||||
data->menui.menu.items[new_item].attr = msg_data->attr;
|
||||
data->menui.menu.items[new_item].color = msg_data->color;
|
||||
strncpy(data->menui.menu.items[new_item].str, msg_data->str,
|
||||
NHMENU_STR_SIZE);
|
||||
/* prevent & being interpreted as a mnemonic start */
|
||||
strNsubst(data->menui.menu.items[new_item].str, "&", "&&", 0);
|
||||
data->menui.menu.items[new_item].presel = msg_data->presel;
|
||||
data->menui.menu.items[new_item].itemflags = msg_data->itemflags;
|
||||
|
||||
/* calculate tabstop size */
|
||||
hDC = GetDC(hWnd);
|
||||
cached_font * font = mswin_get_font(NHW_MENU, msg_data->attr, hDC, FALSE);
|
||||
saveFont = SelectObject(hDC, font->hFont);
|
||||
GetTextMetrics(hDC, &tm);
|
||||
p1 = data->menui.menu.items[new_item].str;
|
||||
p = strchr(data->menui.menu.items[new_item].str, '\t');
|
||||
column = 0;
|
||||
for (;;) {
|
||||
TCHAR wbuf[BUFSZ];
|
||||
RECT drawRect;
|
||||
SetRect(&drawRect, 0, 0, 1, 1);
|
||||
if (p != NULL)
|
||||
*p = '\0'; /* for time being, view tab field as zstring */
|
||||
DrawText(hDC, NH_A2W(p1, wbuf, BUFSZ), strlen(p1), &drawRect,
|
||||
DT_CALCRECT | DT_LEFT | DT_VCENTER | DT_EXPANDTABS
|
||||
| DT_SINGLELINE);
|
||||
data->menui.menu.tab_stop_size[column] =
|
||||
max(data->menui.menu.tab_stop_size[column],
|
||||
drawRect.right - drawRect.left);
|
||||
/* calculate tabstop size */
|
||||
hDC = GetDC(hWnd);
|
||||
cached_font *font =
|
||||
mswin_get_font(NHW_MENU, msg_data->attr, hDC, FALSE);
|
||||
saveFont = SelectObject(hDC, font->hFont);
|
||||
GetTextMetrics(hDC, &tm);
|
||||
p1 = data->menui.menu.items[new_item].str;
|
||||
p = strchr(data->menui.menu.items[new_item].str, '\t');
|
||||
column = 0;
|
||||
for (;;) {
|
||||
TCHAR wbuf[BUFSZ];
|
||||
RECT drawRect;
|
||||
SetRect(&drawRect, 0, 0, 1, 1);
|
||||
if (p != NULL)
|
||||
*p = '\0'; /* for time being, view tab field as zstring */
|
||||
DrawText(hDC, NH_A2W(p1, wbuf, BUFSZ), strlen(p1), &drawRect,
|
||||
DT_CALCRECT | DT_LEFT | DT_VCENTER | DT_EXPANDTABS
|
||||
| DT_SINGLELINE);
|
||||
data->menui.menu.tab_stop_size[column] =
|
||||
max(data->menui.menu.tab_stop_size[column],
|
||||
drawRect.right - drawRect.left);
|
||||
|
||||
menuitemwidth += data->menui.menu.tab_stop_size[column];
|
||||
menuitemwidth += data->menui.menu.tab_stop_size[column];
|
||||
|
||||
if (p != NULL)
|
||||
*p = '\t';
|
||||
else /* last string so, */
|
||||
break;
|
||||
if (p != NULL)
|
||||
*p = '\t';
|
||||
else /* last string so, */
|
||||
break;
|
||||
|
||||
/* add the separation only when not the last item */
|
||||
/* in the last item, we break out of the loop, in the statement
|
||||
* just above */
|
||||
menuitemwidth += TAB_SEPARATION;
|
||||
/* add the separation only when not the last item */
|
||||
/* in the last item, we break out of the loop, in the
|
||||
* statement just above */
|
||||
menuitemwidth += TAB_SEPARATION;
|
||||
|
||||
++column;
|
||||
p1 = p + 1;
|
||||
p = strchr(p1, '\t');
|
||||
++column;
|
||||
p1 = p + 1;
|
||||
p = strchr(p1, '\t');
|
||||
}
|
||||
|
||||
SelectObject(hDC, saveFont);
|
||||
ReleaseDC(hWnd, hDC);
|
||||
|
||||
/* calculate new menu width */
|
||||
data->menui.menu.menu_cx =
|
||||
max(data->menui.menu.menu_cx,
|
||||
2 * TILE_X + menuitemwidth
|
||||
+ (tm.tmAveCharWidth + tm.tmOverhang) * 12);
|
||||
|
||||
/* increment size */
|
||||
data->menui.menu.size++;
|
||||
}
|
||||
SelectObject(hDC, saveFont);
|
||||
ReleaseDC(hWnd, hDC);
|
||||
|
||||
/* calculate new menu width */
|
||||
data->menui.menu.menu_cx =
|
||||
max(data->menui.menu.menu_cx,
|
||||
2 * TILE_X + menuitemwidth
|
||||
+ (tm.tmAveCharWidth + tm.tmOverhang) * 12);
|
||||
|
||||
/* increment size */
|
||||
data->menui.menu.size++;
|
||||
} break;
|
||||
|
||||
case MSNH_MSG_ENDMENU: {
|
||||
|
||||
Reference in New Issue
Block a user