如题

解决方案 »

  1.   

    如果撞了msdn,请在IE中输入mk:@MSITStore:C:\Program%20Files\Microsoft%20Visual%20Studio\MSDN\2001OCT\1033\techart.chm::/html/atlwindow.htm#atlwindow_topic4
      

  2.   

    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
    WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32T1));
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WIN32T1);
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex);
    }从生成的工程中拷贝的代码。
      

  3.   

    view类在PreCreateWindow ,dlg在PreSubClassWindow
      

  4.   

    从向导生成的工程中拷贝的。// win32t1.cpp : Defines the entry point for the application.
    //#include "stdafx.h"
    #include "win32t1.h"#define MAX_LOADSTRING 100// Global Variables:
    HINSTANCE hInst; // current instance
    TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
    TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name// Forward declarations of functions included in this code module:
    ATOM MyRegisterClass(HINSTANCE hInstance);
    BOOL InitInstance(HINSTANCE, int);
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);  // TODO: Place code here.
    MSG msg;
    HACCEL hAccelTable; // Initialize global strings
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_WIN32T1, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance); // Perform application initialization:
    if (!InitInstance (hInstance, nCmdShow))
    {
    return FALSE;
    } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32T1)); // Main message loop:
    while (GetMessage(&msg, NULL, 0, 0))
    {
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    } return (int) msg.wParam;
    }//
    //  FUNCTION: MyRegisterClass()
    //
    //  PURPOSE: Registers the window class.
    //
    //  COMMENTS:
    //
    //    This function and its usage are only necessary if you want this code
    //    to be compatible with Win32 systems prior to the 'RegisterClassEx'
    //    function that was added to Windows 95. It is important to call this function
    //    so that the application will get 'well formed' small icons associated
    //    with it.
    //
    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
    WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32T1));
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WIN32T1);
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex);
    }//
    //   FUNCTION: InitInstance(HINSTANCE, int)
    //
    //   PURPOSE: Saves instance handle and creates main window
    //
    //   COMMENTS:
    //
    //        In this function, we save the instance handle in a global variable and
    //        create and display the main program window.
    //
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
       HWND hWnd;   hInst = hInstance; // Store instance handle in our global variable   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);   if (!hWnd)
       {
          return FALSE;
       }   ShowWindow(hWnd, nCmdShow);
       UpdateWindow(hWnd);   return TRUE;
    }//
    //  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
    //
    //  PURPOSE:  Processes messages for the main window.
    //
    //  WM_COMMAND - process the application menu
    //  WM_PAINT - Paint the main window
    //  WM_DESTROY - post a quit message and return
    //
    //
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc; switch (message)
    {
    case WM_COMMAND:
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    // Parse the menu selections:
    switch (wmId)
    {
    case IDM_ABOUT:
    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    break;
    case IDM_EXIT:
    DestroyWindow(hWnd);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
    case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    // TODO: Add any drawing code here...
    EndPaint(hWnd, &ps);
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }// Message handler for about box.
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
    return (INT_PTR)TRUE; case WM_COMMAND:
    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
    {
    EndDialog(hDlg, LOWORD(wParam));
    return (INT_PTR)TRUE;
    }
    break;
    }
    return (INT_PTR)FALSE;
    }
      

  5.   

    对话框类?需要注册吗?
    我的对话框是直接插入资源,然后直接设计。在vc6下面,先创建一个空win32程序,然后插入一个对话框资源,就如在MFC下的一样,好好设计一下。
    然后打入下面的代码:
    #include <windows.h>     //这个不用说,大家都知道
    #include "resource.h"    //加入资源HINSTANCE hInst;      // current instance//处理对话框消息的回调函数
    LRESULT CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    MSG msg;
    HACCEL hAccelTable;
    hInst = hInstance;  DialogBox(hInst, (LPCTSTR)IDD_DIALOG, NULL, (DLGPROC)DlgProc);   //显示对话框
    hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_WIN32);    //主消息循环:
    while (GetMessage(&msg, NULL, 0, 0)) 
    {
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    } return msg.wParam;
    }
    //对话框消息处理
    LRESULT CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch (message)
    {
    case WM_INITDIALOG:   
    return TRUE;
    case WM_COMMAND: 
    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
    {
    EndDialog(hDlg, LOWORD(wParam));    //结束对话框
    PostQuitMessage(0);                 //发送退出消息
    return TRUE;
    }
    break;
    }
        return FALSE;
    }
      

  6.   

    那就重载PreSubclassWindow,在里边设置样式。或者在OnInitDialog函数里边设置也行。我那个是win32的工程,没用MFC。
      

  7.   

    郁闷,那源代码显示的太难看了,重新来。
    #include <windows.h>     //这个不用说,大家都知道
    #include "resource.h"    //加入资源HINSTANCE hInst;      // current instance//处理对话框消息的回调函数
    LRESULT CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    MSG msg;
    HACCEL hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_WIN32);
    hInst = hInstance;

    //显示对话框
    DialogBox(hInst, (LPCTSTR)IDD_DIALOG, NULL, (DLGPROC)DlgProc);    //主消息循环:
    while (GetMessage(&msg, NULL, 0, 0)) 
    {
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    } return msg.wParam;
    }
    //对话框消息处理
    LRESULT CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch (message)
    {
    case WM_INITDIALOG:   
    return TRUE;
    case WM_COMMAND: 
    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
    {
    EndDialog(hDlg, LOWORD(wParam));    //结束对话框
    PostQuitMessage(0);                 //发送退出消息
    return TRUE;
    }
    break;
    }
        return FALSE;
    }
      

  8.   

    不知道这个东西在哪里实现的
    但是设置窗口风格完全可以再ondialoginitial里面啊
    或者之后都可以
      

  9.   

    MFC里更不用说,对话框显示,那是属于全自动。
    只要在资源里将对话框样式定制为自己喜欢的就行。
    如果需要修改样式,MFC里就在InitDialog里, win32就在刚才的case WM_INITDIALOG里面修改。
    使用GetWindowLong、SetWindowLong、ModifyStyle等函数。MFC中的句柄不用说,而win32中的对话框句柄就是那个参数hDlg
    不知道这下能否解决楼主的问题。
      

  10.   

    对话框不需要你注册窗体类,对话框窗体类被系统注册好的,你只需要调用DialogBox或CreateDialog函数创建对话框即可。但Windows还允许你对调用对话框过程的默认窗体过程进行替换,这涉及到定义一个窗体类名,注册窗体类,提供窗体过程等,这种对话框类型是私有的。具体步骤如下:
    1.向资源视图中添加一个对话框实例,它的rc文件代码如下:
    HECCAL DIALOGEX 0, 0, 173, 150
    STYLE DS_SETFONT | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
    CAPTION "Hex calculator"    //这是必须的
    CLASS "HecCal"
    FONT 8, "MS Shell Dlg", 400, 0, 0x1
    BEGIN
       ...
    END
    需要向CAPTION语句之后添加一个CLASS语句,在这个语句之后添加一个类名,这个类名必须与调用CreateDialog中的第二个参数相同,它表明对话框模板的资源标识符,因此这个资源标识符必须是字符串2.在创建对话框之前,定义一个窗体类,其类名就是对话框模板中CLASS语句指定的类名。
    TCHAR szAppName[MAX_PATH]=_T("HecCal");
    WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = DLGWINDOWEXTRA;   //这是必须的,表示使用对话框窗体额外数据
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_HEXCAL));
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = szAppName;
    wcex.hIconSm = NULL; if(!RegisterClassEx(&wcex))
            {
               return 1;
            }
    3.显示对话框窗体:
      hWnd = CreateDialog(hInstance,szAppName,NULL,NULL);   if (!hWnd)
       {
          return FALSE;
       }   ShowWindow(hWnd, SW_SHOW);
       UpdateWindow(hWnd);
    4.在窗体过程中处理消息,这个窗体过程与普通窗体的窗体过程相同
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {

        
    switch (message)
    {

    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }需要注意的是,Windows为对话框提供了一个默认窗体过程,这个过程是定义在系统里的,其声明形式如下:
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    由这个默认窗体过程来调用用户的对话框过程来执行特定的消息响应,对话框过程声明形式如下:
    INT_PTR CALLBACK DlgProc(HWND,UINT,WPARAM,LPARM);
    当窗体过程在响应WM_CREATE时,会产生一条WM_INITDIALOG消息,然后把这条消息发送给对话框过程,对于其他消息,由对话框对程先处理这些消息,然后对话框过程的返回值用于决定窗体过程是否忽略对话框过程的处理。
      

  11.   

    13楼说的很详细了。但是好像不是解决楼主问题的简便方法。
    其实想修改一个窗口的风格是很方便的,
    可以使用CWnd的4个接口函数就可以了:
    GetStyle
    GetExStyle
    ModifyStyle
    ModifyStyleEx
      

  12.   

    要修改一个窗体类的属性,需要使用SetClassLong函数,以下是它的说明:
    DWORD SetClassLong(HWND hWnd,int nIndex,LONG dwNewLong);
    其中:
       hWnd窗体的句柄,或者间接地,窗体所属的类。
       nIndex指定了要获取的32位值。为了获取从额外类内存中的32位值,指定一个正的,基于0的字节偏移量。可用的值从0到额外内存字节数,减4.为了设置WNDCLASSEX的结构的成员,指定如下值之一:,
    GCL_CBCLSEXTRA关联于类的额外内存的字节尺寸。设置这个值并不会改变被分配的额外字节数量。
    GCL_CBWNDEXTRA关联于类的每个窗体的额外窗体内存的字节尺寸。设置这个值不会改变已被分配的额外字节数量。
    GCL_HBRBACKGROUND类的背景画刷句柄
    GCL_HCURSOR类的光标句柄
    GCL_HICON类的图标句柄
    GCL_HICONSM类的小图标句柄。这会改变窗体中标题栏与任务栏的图标,要想修改对话框的图标,以这个标志为准
    GCL_HMODULE注册类的模块句柄
    GCL_MENUNAME菜单名称字符串地址。字符串标识了关联于类的菜单资源。
    GCL_STYLE窗体类风格位。
    GCL_WNDPROC类的窗体过程地址。
       dwNewLong指定了替代值。
    如果函数成功了,返回值是之前的指定的32位整数。如果之前没有设置值,返回值为0,如果函数失败,返回0
    此函数使用指定的32位值替代窗体类的WNDCLASSEX结构中成员。使用GCL_WNDPROC来调用此函数来创建窗体类的子类会影响到后序用此类创建的所有窗体.一个程序子类化一个系统类,但不子类化由另一个程序创建的一个窗体类.WNDCLASSEX结构中的cbClsExtra成员的非0值应该被保留。使用此函数可能改变类的背景色,但这个改变不会立刻引起属于这个类的所有窗体立刻重绘。