| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2897 人关注过本帖
标题:写了个win32基础的窗口 有些问题请教大牛们
只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 30楼 hellovfp
呵呵 偶尔看看斯诺克 还真带劲 喜欢丁俊晖

刚才去看了下WIN32汇编 哈哈 在原来的程序做了个小小的改动就OK 了 不过有点取巧。
把重绘区域锁定在一个范围后 就不干扰其他的图形了 这样的
程序代码:
void yrjd_OnTimer(HWND hWnd, UINT nIDEvent)
{
    RECT rect = {510, 200, 810, 400};
    choice = (choice + 1) % 6;
    InvalidateRect(hWnd, &rect, TRUE);  
}

....__
程序代码:
void yrjd_OnTimer(HWND hWnd, UINT nIDEvent)
{
    srand(time(NULL));
    RECT rect = {510, 200, 810, 400};
    choice = rand() % 6;
    InvalidateRect(hWnd, &rect, TRUE);  
}
发现在.cpp文件头加很多头文件不太好看 我为了随机显示又添加了两个头文件

[ 本帖最后由 有容就大 于 2012-5-4 16:31 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-05-04 15:50
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
去做了个模版文件 你看下怎么样:
Stdafx.h
程序代码:
///////////////////////////////////////
// Program Name: Stdafx.h
// Programmer: yrjd
// Description: Set head files together
//////////////////////////////////////////

#define STRICT
#define WIN32_LEAN_AND_MEAN

#include <Windows.h>
#include <Windowsx.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>

#pragma warning(disable: 4068)
#pragma warning (disable:4100) // Please think about these two sentences
#pragma hdrstop

Template.cpp
程序代码:
///////////////////////////////////////
// Program Name: Template.cpp
// Programmer: yrjd
// Description: *****Add code here*****
//////////////////////////////////////////

#include "Stdafx.h"
#include "Template.h"

// Global variables
static char szAppName[] = "An Template";
static HINSTANCE hInstance;
static HWND  hWnd;
static int cxClient, cyClient;

//*********************
// Initialization
//*********************

//---------------------------
// WinMain is the entry point
//---------------------------

#pragma argsused
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance,
                   LPSTR lpszCmdParam, int nCmdShow    )
{
    MSG msg;

    if (!hPrevInstance)  // In fact this sentence may be omitted
        if (! Register(hInst))  // Registered Window Class
        {
            return FALSE;
        }
  
    if (!Create(hInst, nCmdShow))   // Create a window instance
    {
        return FALSE;
    }

    while (GetMessage(&msg, NULL, 0, 0)) // Message circulation
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

////////////////////////////////////
// Register the window
////////////////////////////////////

#pragma argsused
BOOL Register(HINSTANCE hInst)
{
    WNDCLASS wndclass;

    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.hInstance = hInst;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;  // Notice this 'szAppName'

    return (RegisterClass(&wndclass));   // The function here is very important
}

////////////////////////////////////
// Create the Window and show it.
////////////////////////////////////

#pragma argsused
BOOL Create(HINSTANCE hInst, int nCmdShow)
{
    hInstance = hInst;   // Connect with the global instance

    HWND hWnd = CreateWindowEx(0, szAppName, szAppName,
                        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0,
                        CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL);
    if (hWnd == NULL)
    {
        return FALSE;
    }

    ShowWindow(hWnd, nCmdShow);   //...
    UpdateWindow(hWnd);           //...

    return TRUE;
}

//*********************
// Implementation
//*********************

//--------------------------------
// The Window proc help control
// the program when it is running
//--------------------------------

LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
                         WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
      HANDLE_MSG(hWnd, WM_CREATE, yrjd_OnCreate);
      HANDLE_MSG(hWnd, WM_SIZE, yrjd_OnSize);
      HANDLE_MSG(hWnd, WM_DESTROY, yrjd_OnDestroy);
      HANDLE_MSG(hWnd, WM_CLOSE, yrjd_OnClose);
      HANDLE_MSG(hWnd, WM_PAINT, yrjd_OnPaint);
      HANDLE_MSG(hWnd, WM_TIMER, yrjd_OnTimer);
  
      default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
}

// Create Window

#pragma argsused
BOOL yrjd_OnCreate(HWND hWnd, CREATESTRUCT FAR *lpCreateStruct)
{
    return TRUE;
}

// Specify the size
void yrjd_OnSize(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    cxClient = LOWORD(lParam);
    cyClient = HIWORD(lParam);
}

// Handle WM_DESTROY
void yrjd_OnDestroy(HWND hWnd)
{
    PostQuitMessage(0);
}

// Handle WM_CLOSE
void yrjd_OnClose(HWND hWnd)
{
    if (IDYES == MessageBox(hWnd, "Do you want to exit?", "choice", MB_YESNO))
    {
        DestroyWindow(hWnd);
    }
}

// Handle WM_PAINT
void yrjd_OnPaint(HWND hWnd)
{
    PAINTSTRUCT ps;
    HDC hdc;
    hdc = BeginPaint(hWnd, &ps);
    // To add code here.....
    EndPaint(hWnd, &ps);
}

// Handle WM_TIMER
void yrjd_OnTimer(HWND hWnd, UINT nIDEvent)
{
    ;
}
_____________
Template.h
程序代码:
////////////////////////////////////////////////
// Program Name: Template.h
// Programmer: yrjd
// Description: Head file for Template.cpp
////////////////////////////////////////////////

// Variables
// Add code here.....

// Some procs
BOOL Register(HINSTANCE hInst);
BOOL Create(HINSTANCE hInst, int nCmdShow);
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
                         WPARAM wParam, LPARAM lParam);

// The yrjd Class
BOOL yrjd_OnCreate(HWND hWnd, CREATESTRUCT FAR *lpCreateStruct);
void yrjd_OnSize(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
void yrjd_OnDestroy(HWND hWnd);
void yrjd_OnPaint(HWND hWnd);
void yrjd_OnTimer(HWND hWnd, UINT nIDEvent);
void yrjd_OnClose(HWND hWnd);

 

[ 本帖最后由 有容就大 于 2012-5-4 18:17 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-05-04 16:21
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 31楼 有容就大
昨天奥沙利文下半场连拿6局,轻松过了半决赛,还打了局单杆过百的。看来最后的对决很精彩。。
享得利在本次比赛也不是没有搞头,打了个最高分147分,拿下了职业赛场上第11个满分,获得本场满分奖5万英磅。
喜欢台球是因为这个运动是最坤士的,智力+体力的完美运动。

你的模版做得还是不错的,这样可以节省好多的体力活呀。。呵呵。
一会儿我把DCCopy汇编改写成C语言的给你吧。

我们都在路上。。。。。
2012-05-05 11:07
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 33楼 hellovfp
今天还有两场半决赛吧 看好谁?奥沙利文?

梅尚程荀
马谭杨奚







                                                       
2012-05-05 11:17
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 34楼 有容就大
另一场谁胜出还不知道呢。。呵呵,得看看结果。奥哥很多的人都看好,
不过偶觉得赛场上的事,还是有变数,比如说昨天虽然奥哥虽然赢了,但有几局运气还是不怎么好,白球都有落袋的情况出现。

程序代码:
/*
    通过本程序,你可以了解到,DC(Device Context)倒底是什么,设备环境仅仅是一个环境。
    在windows程序中,你不可能指望在窗口里显示的内容会在下一刻还保留在那里。
    所以需要用WM_PAINT事件里把窗口中的内容恢复出来,这是程序应该做的事,而不是系统要做
    的事。


 */

#define UNICODE
#define _UNICODE

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

//////////////////////////////////////////////////////////
const PTCHAR szClass1    = _T("SourceWindow");
const PTCHAR szClass2    = _T("DesWindow");
const PTCHAR szCaption1 = _T("请尝试用别的窗口覆盖本窗口!");
const PTCHAR szCaption2 = _T("本窗口图像拷贝自另一窗口");
const PTCHAR szText        = _T("Win32 Assmebly, Simple and pwerful!");

HINSTANCE hHandle    = 0;
HWND hWin1;
HWND hWin2;

//////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void CALLBACK ProcTimer(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);

void on_paint(HWND, HDC);
void on_close(HWND);
//////////////////////////////////////////////////////////

//程序入口
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR cmdLine, int nShow)
{
    MSG msg;
    WNDCLASS wnd;
    UINT hTimer;
    
    
    hHandle = hInst;
    
    memset(&wnd, 0, sizeof(wnd) );
    wnd.hCursor            = LoadCursor(NULL, IDC_ARROW);
    wnd.hInstance       = hInst;
    wnd.lpfnWndProc     = WndProc;
    wnd.lpszClassName   = szClass1;
    wnd.style           = CS_HREDRAW | CS_VREDRAW;
    wnd.hbrBackground   = (HBRUSH) COLOR_WINDOW + 1;
    
    RegisterClass(&wnd);
    
    hWin1 = CreateWindow(szClass1, 
                        szCaption1,
                        WS_OVERLAPPEDWINDOW,
                        450, 100, 300, 300,
                        0,
                        0,
                        hInst,
                        0);
    
    ShowWindow(hWin1, SW_SHOWNORMAL);
    UpdateWindow(hWin1);
    
    wnd.lpszClassName = szClass2;
    RegisterClass(&wnd);
    
    hWin2 = CreateWindow(szClass2, 
                        szCaption2,
                        WS_OVERLAPPEDWINDOW,
                        100, 100, 300, 300,
                        0,
                        0,
                        hInst,
                        0);
    
    ShowWindow(hWin2, SW_SHOWNORMAL);
    UpdateWindow(hWin2);
    
    hTimer = SetTimer(0, 0, 100, ProcTimer);
    
    
    while( GetMessage(&msg , NULL, 0, 0) >0 )
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    KillTimer(0, hTimer);
    
    return (int)msg.wParam;
}

//消息回调过程
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_PAINT:
            HDC hdc;
            PAINTSTRUCT ps;
            hdc = BeginPaint(hwnd, &ps);
            on_paint(hwnd, hdc);
            EndPaint(hwnd, &ps);
            break;
        case WM_CLOSE:
            on_close(hwnd);
            break;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

//定时器回调过程
void CALLBACK ProcTimer(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
{
    HDC hDc1, hDc2;
    RECT stRect;
    
    hDc1 = GetDC(hWin1);
    hDc2 = GetDC(hWin2);
    
    GetClientRect(hWin1, &stRect);
    BitBlt(hDc2, 0, 0, stRect.right, stRect.bottom,    hDc1, 0, 0, SRCCOPY);
    
    
    ReleaseDC(hWin1, hDc1);
    ReleaseDC(hWin2, hDc2);
}

void on_close(HWND hwnd)
{
    if(IDYES == MessageBox(hwnd, _T("真的要退出吗?"), _T("您确定么?"), MB_YESNO) )
    {
        DestroyWindow(hwnd);
        PostQuitMessage(0);
    }
}

void on_paint(HWND hwnd, HDC hdc)
{
    RECT stRect;
    
    if(hwnd == hWin1)
    {
        GetClientRect(hwnd, &stRect);
        DrawText(hdc, szText, -1, &stRect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    }
}


我们都在路上。。。。。
2012-05-05 12:07
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
大哥 再问个问题
我去搞了下兼容DC 大致流程这样
程序代码:
    HWND hWnd;
    HDC hdcBuf;
    HBITMAP hbmpBuf;
    RECT rect = {0, 0, 200, 200}
  
    HDC hdcMain = GetDC(hWnd);
    hdcBuf = CreateCompatibleDC(hdcMain);
    hbmpBuf = CreateCompatibleBitmap(hdcMain, 200, 200);
    SelectObject(hdcBuf, hbmpBuf);
    FillRect(hdcBuf, &rect, (HBRUSH)GetStockObject(WHITE_BRUSH));
    ReleaseDC(hWnd, hdcMain);
先创建一个窗口 hWnd 然后在这个窗口下衍生一个兼容设备hdcBuf 发现这时候如果想获取
hdcBuf的窗口句柄就无从下手,是不是内存DC不存在HWND呢?
有没有这种可能
先分别创建两个窗口hWnd1, hWnd2 他们对应的DC 分别是hdc1, hdc2
在通过一个什么法子让hdc2成为hdc1的兼容设备?这样我们就可以操控hdc2的窗口句柄hWnd2实现某些想
要的API功能。


[ 本帖最后由 有容就大 于 2012-5-5 12:16 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-05-05 12:14
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 35楼 hellovfp
程序代码:
  hTimer = SetTimer(0, 0, 55, ProcTimer);
   
   
    while( GetMessage(&msg , NULL, 0, 0) >0 )
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
   
    KillTimer(0, hTimer);
这段很有意思 WM_TIMER是在消息队列之外吗?
为什么 用目的窗口覆盖源窗口 程序会自行拷贝出很多子窗口 而且还超不出第一个目的窗口的范围?

梅尚程荀
马谭杨奚







                                                       
2012-05-05 12:34
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 36楼 有容就大
创建兼容DC的时候,可以使用NULL参数,得到的是和你的当前屏幕相兼容的DC,而且默认会放一张黑白位图在里面。如果你不用彩色位图选进这个DC的话,出来的就是黑白的图。
如果窗口没有创建,第二种方法,还可以通过GetDeskTopWindow取得桌面的窗口句柄。
这个在Win32汇编中有讲到的。

我们都在路上。。。。。
2012-05-05 13:02
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 37楼 有容就大
这个是定时器的两种用法,在Win32汇编第六章和windows编程中有详解。一种是发送WM_TIMER到消息队列中,一种是通过定时器回调函数。

为什么这个程序会出现表现的这种情况,就是书中讲的别的程序内容通过DC写到下面覆盖的窗口中了。。
所以DC只是一个环境,在书中特别指出使用GDI的用户时记得应该牢记,DC只是一个环境。而不是Device设备!

了解这个DC的真正函意让你在写图形界面的程序时,得心应手。

我们都在路上。。。。。
2012-05-05 13:07
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
在去看看……

梅尚程荀
马谭杨奚







                                                       
2012-05-05 13:14
快速回复:写了个win32基础的窗口 有些问题请教大牛们
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017608 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved