注册 登录
编程论坛 Windows论坛

windows程序设计HexCalc程序 createdialog函数返回NULL问题,求帮助

wuyexinfei 发布于 2017-05-14 15:02, 1709 次点击
windows程序设计HEXALC.C的CreateDialog函数创建失败 断点监控显示返回NULL ,调用getlasterror函数返回1813(加载资源失败),资源只加载了手动输入的dialog模板,具体是那步出错了没找到答案 百度了也没有相似案例 ,代码都是按原书来的.感觉应该是哪步的设置不对 .

手动dialog模板是通过    文件->新建->文件->File创建的. 然后点击右键资源->导入到资源界面里的,不知道是不是这的问题



//下边是到消息循环的代码,执行到createdialog函数时返回了NULL,创建失败处用红色标出了
  ***************************************************************************************************
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[] = TEXT("HexCalc");
    HWND         hwnd;
    MSG          msg;
    WNDCLASS     wndclass;

    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = DLGWINDOWEXTRA;    // Note!
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;

    if (!RegisterClass(&wndclass))
    {
        MessageBox(NULL, TEXT("This program requires Windows NT!"),
            szAppName, MB_ICONERROR);
        return 0;
    }

    hwnd = CreateDialog(hInstance, szAppName, 0, NULL);//此处创建失败

    ShowWindow(hwnd, iCmdShow);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

void ShowNumber(HWND hwnd, UINT iNumber)
{
    TCHAR szBuffer[20];

    wsprintf(szBuffer, TEXT("%X"), iNumber);
    SetDlgItemText(hwnd, VK_ESCAPE, szBuffer);
}

DWORD CalcIt(UINT iFirstNum, int iOperation, UINT iNum)
{
    switch (iOperation)
    {
    case '=': return iNum;
    case '+': return iFirstNum + iNum;
    case '-': return iFirstNum - iNum;
    case '*': return iFirstNum *  iNum;
    case '&': return iFirstNum &  iNum;
    case '|': return iFirstNum | iNum;
    case '^': return iFirstNum ^  iNum;
    case '<': return iFirstNum << iNum;
    case '>': return iFirstNum >> iNum;
    case '/': return iNum ? iFirstNum / iNum : MAXDWORD;
    case '%': return iNum ? iFirstNum % iNum : MAXDWORD;
    default: return 0;
    }
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static BOOL  bNewNumber = TRUE;
    static int   iOperation = '=';
    static UINT  iNumber, iFirstNum;
    HWND         hButton;

    switch (message)
    {
    case WM_KEYDOWN:                   // left arrow --> backspace
        if (wParam != VK_LEFT)
            break;
        wParam = VK_BACK;
        // fall through
    case WM_CHAR:
        if ((wParam = (WPARAM)CharUpper((TCHAR *)wParam)) == VK_RETURN)
            wParam = '=';

        if (hButton = GetDlgItem(hwnd, wParam))
        {
            SendMessage(hButton, BM_SETSTATE, 1, 0);
            Sleep(100);
            SendMessage(hButton, BM_SETSTATE, 0, 0);
        }
        else
        {
            MessageBeep(0);
            break;
        }
        // fall through
    case WM_COMMAND:
        SetFocus(hwnd);

        if (LOWORD(wParam) == VK_BACK)         // backspace
            ShowNumber(hwnd, iNumber /= 16);

        else if (LOWORD(wParam) == VK_ESCAPE)  // escape
            ShowNumber(hwnd, iNumber = 0);

        else if (isxdigit(LOWORD(wParam)))    // hex digit
        {
            if (bNewNumber)
            {
                iFirstNum = iNumber;
                iNumber = 0;
            }
            bNewNumber = FALSE;

            if (iNumber <= MAXDWORD >> 4)
                ShowNumber(hwnd, iNumber = 16 * iNumber + wParam -
                    (isdigit(wParam) ? '0' : 'A' - 10));
            else
                MessageBeep(0);
        }
        else                                    // operation
        {
            if (!bNewNumber)
                ShowNumber(hwnd, iNumber =
                    CalcIt(iFirstNum, iOperation, iNumber));
            bNewNumber = TRUE;
            iOperation = LOWORD(wParam);
        }
        return 0;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

****************************************************
//下边是手动创建的dialog模板
*****************************************************************************

HexCalc DIALOG -1, -1, 102, 122
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
CLASS "HexCalc"
CAPTION "Hex Calculator"
{
     PUSHBUTTON "D",       68,  8,  24, 14, 14
     PUSHBUTTON "A",       65,  8,  40, 14, 14
     PUSHBUTTON "7",       55,  8,  56, 14, 14
     PUSHBUTTON "4",       52,  8,  72, 14, 14
     PUSHBUTTON "1",       49,  8,  88, 14, 14
     PUSHBUTTON "0",       48,  8, 104, 14, 14
     PUSHBUTTON "0",       27, 26,   4, 50, 14
     PUSHBUTTON "E",       69, 26,  24, 14, 14
     PUSHBUTTON "B",       66, 26,  40, 14, 14
     PUSHBUTTON "8",       56, 26,  56, 14, 14
     PUSHBUTTON "5",       53, 26,  72, 14, 14
     PUSHBUTTON "2",       50, 26,  88, 14, 14
     PUSHBUTTON "Back",     8, 26, 104, 32, 14
     PUSHBUTTON "C",       67, 44,  40, 14, 14
     PUSHBUTTON "F",       70, 44,  24, 14, 14
     PUSHBUTTON "9",       57, 44,  56, 14, 14
     PUSHBUTTON "6",       54, 44,  72, 14, 14
     PUSHBUTTON "3",       51, 44,  88, 14, 14
     PUSHBUTTON "+",       43, 62,  24, 14, 14
     PUSHBUTTON "-",       45, 62,  40, 14, 14
     PUSHBUTTON "*",       42, 62,  56, 14, 14
     PUSHBUTTON "/",       47, 62,  72, 14, 14
     PUSHBUTTON "%",       37, 62,  88, 14, 14
     PUSHBUTTON "Equals",  61, 62, 104, 32, 14
     PUSHBUTTON "&&",      38, 80,  24, 14, 14
     PUSHBUTTON "|",      124, 80,  40, 14, 14
     PUSHBUTTON "^",       94, 80,  56, 14, 14
     PUSHBUTTON "<",       60, 80,  72, 14, 14
     PUSHBUTTON ">",       62, 80,  88, 14, 14
}
**************************************************************
0 回复
1