创建一个有四个窗口的多线程程序,第一个窗口显示一个递增的数列,第二个窗口显示一个递增的质数数列,第三个窗口显示一个递增的斐波那契数列,第四个窗口显示一些随机产生大小不一的圆
一个可能的方案是使用WM_TIMER消息中处理多个更新,但是没有人圆心根据计算机速度来写程序;
看看多线程的解决方法:
程序有点长,思路却很清晰
#include<windows.h>
#include<math.h>
#include<process.h>
typedef struct
{
HWND hwnd;
int cxClient;
int cyClient;
int cyChar;
BOOL bKill;
}
PARAMS,*PPARAMS;
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
static TCHAR szAppName[]=TEXT("leidemingzi");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WindowProc;
wndclass.lpszClassName=szAppName;
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("the program require the window nt"),TEXT("tips"),MB_ICONERROR);
return 0;
}
hwnd=CreateWindow(
szAppName, // registered class name
TEXT("this is title"), // window name
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // horizontal position of window
CW_USEDEFAULT, // vertical position of window
CW_USEDEFAULT, // window width
CW_USEDEFAULT, // window height
NULL, // handle to parent or owner window
NULL, // menu handle or child identifier
hInstance, // handle to application instance
NULL // window-creation data
);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
int CheckBottom(HWND hwnd,int cyClient,int cyChar,int iLine)
{
if(iLine*cyChar+cyChar>cyClient)
{
InvalidateRect(hwnd,NULL,TRUE);
UpdateWindow(hwnd);
iLine=0;
}
return iLine;
}
//the window1
VOID Thread1(PVOID pvoid)
{
HDC hdc;
int iNum=0,iLine=0;
PPARAMS pparams;
TCHAR szBuffer[20];
pparams=(PPARAMS)pvoid;
while(!pparams->bKill)
{
if(iNum<0)
iNum=0;
iLine=CheckBottom(pparams->hwnd,pparams->cyClient,pparams->cyChar,iLine);
hdc=GetDC(pparams->hwnd);
TextOut(hdc,0,iLine*pparams->cyChar,szBuffer,wsprintf(szBuffer,TEXT("%d"),iNum++));
ReleaseDC(pparams->hwnd,hdc);
iLine++;
}
_endthread();
}
LRESULT CALLBACK WindowProc1(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
static PARAMS params;
switch(uMsg)
{
case WM_CREATE:
params.hwnd=hwnd;
params.cyChar=HIWORD(GetDialogBaseUnits());
_beginthread(Thread1,0,¶ms);
return 0;
case WM_SIZE:
params.cyClient=HIWORD(lParam);
return 0;
case WM_DESTROY:
params.bKill=TRUE;
return 0;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
//the second window
VOID Thread2(PVOID pvoid)
{
HDC hdc;
int iNum=1,iLine=0,i,iSqrt;
PPARAMS pparams;
TCHAR szBuffer[20];
pparams=(PPARAMS)pvoid;
while(!pparams->bKill)
{
do
{
if(++iNum<0)
{
iNum=0;
}
iSqrt=(int)sqrt((double)iNum);
for(i=2;i<=iSqrt;++i)
{
if(iNum%i==0)
break;
}
} while (i<=iSqrt);
iLine=CheckBottom(pparams->hwnd,pparams->cyClient,pparams->cyChar,iLine);
hdc=GetDC(pparams->hwnd);
TextOut(hdc,0,iLine*pparams->cyChar,szBuffer,wsprintf(szBuffer,TEXT("%d"),iNum));
ReleaseDC(pparams->hwnd,hdc);
iLine++;
}
_endthread();
}
LRESULT CALLBACK WindowProc2(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
static PARAMS params;
switch(uMsg)
{
case WM_CREATE:
params.hwnd=hwnd;
params.cyChar=HIWORD(GetDialogBaseUnits());
_beginthread(Thread2,0,¶ms);
return 0;
case WM_SIZE:
params.cyClient=HIWORD(lParam);
return 0;
case WM_DESTROY:
params.bKill=TRUE;
return 0;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
//the third window
VOID Thread3(PVOID pvoid)
{
HDC hdc;
int iNum=0,iNext=1,iLine=0,iTemp;
PPARAMS pparams;
TCHAR szBuffer[20];
pparams=(PPARAMS)pvoid;
while(!pparams->bKill)
{
if(iNum<0)
{
iNum=0;
iNext=1;
}
iLine=CheckBottom(pparams->hwnd,pparams->cyClient,pparams->cyChar,iLine);
hdc=GetDC(pparams->hwnd);
TextOut(hdc,0,iLine*pparams->cyChar,szBuffer,wsprintf(szBuffer,TEXT("%d"),iNum));
ReleaseDC(pparams->hwnd,hdc);
iTemp=iNum;
iNum=iNext;
iNext+=iTemp;
iLine++;
}
_endthread();
}
LRESULT CALLBACK WindowProc3(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
static PARAMS params;
switch(uMsg)
{
case WM_CREATE:
params.hwnd=hwnd;
params.cyChar=HIWORD(GetDialogBaseUnits());
_beginthread(Thread3,0,¶ms);
return 0;
case WM_SIZE:
params.cyClient=HIWORD(lParam);
return 0;
case WM_DESTROY:
params.bKill=TRUE;
return 0;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
//the forth window
VOID Thread4(PVOID pvoid)
{
HDC hdc;
int iDiameter;
PPARAMS pparams;
pparams=(PPARAMS)pvoid;
while(!pparams->bKill)
{
InvalidateRect(pparams->hwnd,NULL,TRUE);
UpdateWindow(pparams->hwnd);
iDiameter=rand()%(max(1,min(pparams->cxClient,pparams->cyClient)));
hdc=GetDC(pparams->hwnd);
Ellipse(hdc,(pparams->cxClient-iDiameter)/2,(pparams->cyClient-iDiameter)/2,
(pparams->cxClient+iDiameter)/2,(pparams->cyClient+iDiameter)/2);
ReleaseDC(pparams->hwnd,hdc);
}
_endthread();
}
LRESULT CALLBACK WindowProc4(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
static PARAMS params;
switch(uMsg)
{
case WM_CREATE:
params.hwnd=hwnd;
params.cyChar=HIWORD(GetDialogBaseUnits());
_beginthread(Thread4,0,¶ms);
return 0;
case WM_SIZE:
params.cxClient=LOWORD(lParam);
params.cyClient=HIWORD(lParam);
return 0;
case WM_DESTROY:
params.bKill=TRUE;
return 0;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
static HWND hwndChild[4];
static TCHAR *szChildClass[]={TEXT("Child1"),TEXT("Child2"),TEXT("Child3"),TEXT("Child4")};
static WNDPROC ChildProc[]={WindowProc1,WindowProc2,WindowProc3,WindowProc4};
HINSTANCE hInstance;
int i,cxClient,cyClient;
WNDCLASS wndclass;
switch(uMsg)
{
case WM_CREATE:
hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);
wndclass.hInstance=hInstance;
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
for(i=0;i<4;++i)
{
wndclass.lpfnWndProc=ChildProc[i];
wndclass.lpszClassName=szChildClass[i];
RegisterClass(&wndclass);
hwndChild[i]=CreateWindow(szChildClass[i],NULL,WS_CHILDWINDOW|WS_BORDER|WS_VISIBLE,0,0,0,0,hwnd,(HMENU)i,hInstance,NULL);
}
return 0;
case WM_SIZE:
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);
for(i=0;i<4;++i)
{
MoveWindow(hwndChild[i],(i%2)*cxClient/2,(i>1)*cyClient/2,cxClient/2,cyClient/2,TRUE);
}
return 0;
case WM_CHAR:
if(wParam=='x1B')
DestroyWindow(hwnd);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
分享到:
相关推荐
本资源内容:1、线程A访问非线程A创建的控件的三种方式 2、线程中创建的窗体置顶显示ShowDialog的方法。
python基于scrcpy的多线程简易USB安卓投屏工具源码。用Python写的一个基于scrcpy的多线程简易USB安卓投屏工具,很方便,支持设置传输比特率、自动录屏等。仅支持Windows系统。可以用作一个小工具,较为方便。主要是...
一些MFC的函数及使用方法:多线程操作变量时,锁定变量;将程序推送到最顶端(非置顶);将字符串按某字符或字符串进行分割;获取系统时间;获取程序运行目录。
置顶和置底的js
1,支持自动获取剪贴板数据省去...4,支持单线程多线程切换(少于10个ip自动单线程) 5,支持ping D段ip 6,按钮右键可清空数据如列表框、编辑框 7,支持设置ping次数,ping包大小,-t选项 8,统计最终结果 9,其他...
1.python可调用dll,使弹窗获取超级置顶权限ZBID_UIACCESS,位于置顶任务管理器之上。 当前对外提供的接口弹窗置顶都无法超越win10任务管理器 2.使用方法 dll文件全都放在调用的py文件同一目录。 from ctypes import...
两个exe文件,下载后把每个右键快捷方式发送到桌面,找到桌面上的图标,分别右键属性找到快捷键给这俩设置快捷键,比如置顶F7,取消置顶F8(win7下正常使用)
控制窗口置顶和永久显示,并且限制鼠标移动
我们经常在进行窗口的多任务中,信息窗口经常切换,影响工作效率。窗口置顶助手可以把某个窗口置顶,对着置顶窗口查看信息或在置顶窗口记笔记,可提高工作效率。类似于Spy++的查找窗口的功能,本程序增加在找到窗口...
把对话框中的图标拖到需要置顶的窗口上即可
2、启动后默认最小化在任务栏,开机自启动; 3、默认ctrl+alt+a快捷键截图,截图后自动置顶显示,双击可以收缩; 4、图标右键“选项”可以按习惯设置软件:启动界面、开机启动、快捷键等; 5、如果截屏时窗口显示有...
C# 实现每日、每小时自我总结小软件。...2、每一小时自动弹窗置顶,让你写这一小时的工作学习内容。 3、有周总结和月总结导出功能 4、用xml文件模拟数据库分库操作 注意:将Hynet文件夹放到D盘下面
易语言窗口置顶源码,窗口置顶,GetForegroundWindow,SetWindowPos
可以置顶 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
强制置顶工具,倒思制作的。 使用方法先点击需要置顶的窗口,再按F7或F8,一个是置顶,一个是取消置顶。
亲测,绝对好用的窗口置顶工具!!(本人一直在用) 上班、娱乐,方便快捷!!
vs2010实现对其进程的窗口置顶、取消置顶操作;实现DROPFILES消息封装并发送给其他进程。 注:1.一个pid获取到的是多个窗口句柄,操作的要是主窗口句柄;2.可以配合spy++看获取到的句柄是否正确;
屏幕置顶Snipaste 是一款简单强大的截图取色软件 屏幕置顶Snipaste 是一款简单强大的截图取色软件 屏幕置顶Snipaste 是一款简单强大的截图取色软件 屏幕置顶Snipaste 是一款简单强大的截图取色软件 屏幕置顶Snipaste...
模仿QQ对ListView中的单条侧滑, 显示删除和置顶!
将自己想要的窗口置顶:以Google浏览器为例,将自己想要的窗口置顶:以Google浏览器为例,将自己想要的窗口置顶:以Google浏览器为例,将自己想要的窗口置顶:以Google浏览器为例,将自己想要的窗口置顶:以Google...