游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2091|回复: 6

关于窗口!

[复制链接]

21

主题

69

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2004-7-23 13:18:00 | 显示全部楼层 |阅读模式
我是新手,下面这段窗口代码调试不出来!有三个warning并且无法显示窗口,但是运行的话确实在进程中能看到这个!
大家帮我看看咋回事,谢谢!
#include <windows.h>
#include <stdlib.h>
#include <string.h>

long WINAPI WndProc(HWND hwnd,
                                        UINT iMessage,
                                        UINT wParam,
                                        LONG lParam);

BOOL InitWindowsClass(HINSTANCE hInstance, WNDCLASS wc);
BOOL InitWindows(HINSTANCE hInstance, int nCmdShow, HWND hw);


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
        HWND hwnd;
        WNDCLASS wndclass;
        MSG Message;

        InitWindowsClass(hInstance, wndclass);
        InitWindows(hInstance, nCmdShow, hwnd);
       
        while(GetMessage(&Message, 0, 0, 0))
        {
                TranslateMessage(&Message);
                DispatchMessage(&Message);
        }
        return Message.wParam;
}

LONG WINAPI WndProc(HWND hWnd,
                                        UINT iMessage,
                                        UINT wParam,
                                        LONG lParam)
{
        HDC hDC;
        HBRUSH hBrush;
        HPEN hPen;
        PAINTSTRUCT PtStr;
        switch(iMessage)
        {
        case WM_PAINT:
                hDC = BeginPaint(hWnd, &amptStr);
                SetMapMode(hDC, MM_ANISOTROPIC);
                hPen = (HPEN)GetStockObject(BLACK_PEN);

                hBrush = (HBRUSH)GetStockObject(DKGRAY_BRUSH);
                SelectObject(hDC, hBrush);
                SelectObject(hDC, hPen);
                RoundRect(hDC, 50, 120, 100, 200, 15, 15);
                hBrush = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
                SelectObject(hDC, hBrush);
                Ellipse(hDC, 150, 50, 200, 150);
                hBrush = (HBRUSH)GetStockObject(HOLLOW_BRUSH);
                SelectObject(hDC, hBrush);
                Pie(hDC, 250, 50, 300, 100, 250, 50, 300, 50);
                EndPaint(hWnd, &PtStr);
                return 0;
        case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
        default:
                return(DefWindowProc(hWnd, iMessage, wParam, lParam));

        }
}

BOOL InitWindows(HINSTANCE hInstance, int nCmdShow, HWND hw)
{

        HWND hWnd;
        hWnd = hw;
        hWnd = CreateWindow("trywindow",
                "example",
                WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT,
                0,
                CW_USEDEFAULT,
                0,
                NULL,
                NULL,
                hInstance,
                NULL);

        ShowWindow(hWnd, nCmdShow);
        UpdateWindow(hWnd);
        return TRUE;
}

BOOL InitWindowsClass(HINSTANCE hInstance, WNDCLASS wc)
{
        WNDCLASS wndclass;
        wndclass = wc;
        wndclass.cbClsExtra = 0;
        wndclass.cbWndExtra = 0;
        wndclass.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH));
        wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
        wndclass.hIcon = LoadIcon(NULL, "END");
        wndclass.hInstance = hInstance;
        wndclass.lpfnWndProc = WndProc;
        wndclass.lpszClassName = "winfill";
        wndclass.lpszMenuName = NULL;
        wndclass.style = CS_HREDRAW|CS_VREDRAW;
        if(! RegisterClass(&wndclass))
        {
                MessageBeep(0);
                return FALSE;
        }
       
} [em6] [em6] [em6]

14

主题

67

帖子

75

积分

注册会员

Rank: 2

积分
75
发表于 2004-7-23 17:04:00 | 显示全部楼层

Re:关于窗口!

我大概的看了一下,首先你没有回调函数。
你的代码我也还在调试中,好了,发上来

14

主题

67

帖子

75

积分

注册会员

Rank: 2

积分
75
发表于 2004-7-23 17:26:00 | 显示全部楼层

Re:关于窗口!

好了,兄弟
我把你的代码修改好,现在发上去给你看看。不过,我写的代码我有一两个建议,不正确的话,还希望你指正。
首先,我觉得你的有些函数是可以合并在一起的。比如,BOOL InitWindowsClass(HINSTANCE hInstance);
BOOL InitWindows(HINSTANCE hInstance, int nCmdShow);
还有就是你有的参数传过去了,但是你在函数体中定义了同样的变量,参数并没有使用,所以我不知道你传的参数有什么用。
你不能显示的最大原因是你没有使用你已经注册的类。
你要可以仔细看看CreateWindow()这个函数。其他我还改了一些地方。
我只是建议,不对的地方不要见怪

代码:
#include <windows.h>
#include <stdlib.h>
#include <string.h>

LRESULT        CALLBACK WndProc(HWND hwnd,UINT iMessage,UINT wParam,LONG lParam);
BOOL InitWindowsClass(HINSTANCE hInstance);
BOOL InitWindows(HINSTANCE hInstance, int nCmdShow);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
   MSG Message;
   InitWindowsClass(hInstance);
    InitWindows(hInstance, nCmdShow);
  while(GetMessage(&Message, 0, 0, 0))
  {
   TranslateMessage(&Message);
   DispatchMessage(&Message);
  }
   return Message.wParam;
}

LONG WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)
{
   HDC hDC;
   HBRUSH hBrush;
   HPEN hPen;
   PAINTSTRUCT PtStr;
    switch(iMessage)
        {
      case WM_PAINT:
      hDC = BeginPaint(hWnd, &amptStr);
      SetMapMode(hDC, MM_ANISOTROPIC);
       hPen = (HPEN)GetStockObject(BLACK_PEN);
       hBrush = (HBRUSH)GetStockObject(DKGRAY_BRUSH);
       SelectObject(hDC, hBrush);
       SelectObject(hDC, hPen);
       RoundRect(hDC, 50, 120, 100, 200, 15, 15);
      hBrush = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
       SelectObject(hDC, hBrush);
       Ellipse(hDC, 150, 50, 200, 150);
      hBrush = (HBRUSH)GetStockObject(HOLLOW_BRUSH);
     SelectObject(hDC, hBrush);
     Pie(hDC, 250, 50, 300, 100, 250, 50, 300, 50);
       EndPaint(hWnd, &PtStr);
      return 0;
      case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
      default:
       return(DefWindowProc(hWnd, iMessage, wParam, lParam));
        }
}

BOOL InitWindows(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
    hWnd = CreateWindow("winfill",
      "example",
       WS_OVERLAPPEDWINDOW,
        0,
       0,
600,
400,
     NULL,
     NULL,
     hInstance,
     NULL);
     ShowWindow(hWnd, nCmdShow);
      UpdateWindow(hWnd);
       return TRUE;
}

BOOL InitWindowsClass(HINSTANCE hInstance)
{
    WNDCLASS wndclass;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH));
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
     wndclass.hIcon = LoadIcon(NULL, NULL);
     wndclass.hInstance = hInstance;
      wndclass.lpfnWndProc = (WNDPROC) WndProc;
      wndclass.lpszClassName = "winfill";
      wndclass.lpszMenuName = NULL;
     wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    if(! RegisterClass(&wndclass))
        {
       return FALSE;
        }
        return true;
}

14

主题

67

帖子

75

积分

注册会员

Rank: 2

积分
75
发表于 2004-7-23 17:28:00 | 显示全部楼层

Re:关于窗口!

顺便说一句,你的三个头文件,有两个暂时没有用到。除了
#include <windows.h>

21

主题

69

帖子

69

积分

注册会员

Rank: 2

积分
69
 楼主| 发表于 2004-7-23 21:35:00 | 显示全部楼层

Re:关于窗口!

还是不ok!
上面的程序你执行完能显示窗口吗?

63

主题

871

帖子

891

积分

高级会员

Rank: 4

积分
891
QQ
发表于 2004-7-23 21:53:00 | 显示全部楼层

Re:关于窗口!

问题可能是: 注册的类名 和 显示窗口时的类名不一至
看看msdn巴

14

主题

67

帖子

75

积分

注册会员

Rank: 2

积分
75
发表于 2004-7-24 09:34:00 | 显示全部楼层

Re:关于窗口!

我在2000下面已经可以正确的显示了,我的编译器是vc6。
我不知道你用什么编译机器
你把我发的代码全部贴上去。只要是2000和vc6就一定行。不要在你的代码上面改,就直接贴我的,然后和你自己的对照看看,你主要是窗口类没有用。注册了但是没有用,你仔细看看我的程序。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-4 05:35

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表