精华内容
下载资源
问答
  • WinMain
    千次阅读
    2021-05-21 17:38:29

    WinMain()函数

    DOS下的C语言从main()开始,Windows下的C语言从WinMain()开始,一个空的WinMain()函数是这样的:

    int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

    {

    return(0);

    }

    一个函数即使什么也没做,也应该返回一个值。是的,有好多东西我们不熟悉。首先的首先,WINAPI是个什么声明?WINAPI是在windows.h头文件中定义的一个宏,它把函数调用翻译成正确的调用约定。当我们在程序中需要用到汇编语言的时候,我们在来深究它好了,记住,如果要用WinMain(),就必须要有WINAPI。

    下一步让我们来看看括号里的四个参数:

    ◎ HINSTANCE hinstance:HINSTANCE是一个句柄类型的标识符。变量hinstance是一个整数,用于标识程序实例。Windows设置这个参数的值,并把它传递给你的程序代码。很多Windows函数都要用到它。

    ◎ HINSTANCE hPreInstance:你不用担心这个参数,它已经被废掉了。它只是为古老的Windows版本服务的。你将还会看到类似的情况。

    ◎ LPSTR lpCmdLine:是一个指向字符串的指针,它仅在程序名是从DOS命令行输入或是从Run对话框中输入时才起作用。因此,很少被程序代码所用。

    ◎ int nCmdShow:决定了窗口在初始显示时的状态。Windows通常给这个参数分配一个值。通常是SW_打头的一个常量。例如SW_SHOWNORMAL表示默认状态,SW_MAXINIZE或SW_MINIMIZE分别表示最大和最小模式等等。

    posted on 2006-07-27 17:51 黑色火焰 阅读(3485) 评论(2)  编辑 收藏 引用

    更多相关内容
  • WinMain.rar

    2020-02-20 09:59:36
    c++窗体程序设计必备winmain函数
  • 有关CodeMax编辑控件的文章。
  • WINMAIN

    2019-05-10 00:02:55
    __stdcall 就是让编译器知道应该以兼容windows的方式来产生机器指令,如果你在别的平台开发,当然也不会去写winmain WINAPI 转换成CALLBACK也是可行的,因为#define CALLBACK __stdcall,但人家之所以给同一个东西...

    #define WINAPI __stdcall
    __stdcall 就是让编译器知道应该以兼容windows的方式来产生机器指令,如果你在别的平台开发,当然也不会去写winmain
    WINAPI 转换成CALLBACK也是可行的,因为#define CALLBACK __stdcall,但人家之所以给同一个东西定义两个宏,当然是为了让程序能看懂,不然你在winmain前加一个CALLBACK别人要怎么理解呢。
    去掉以后可以运行,但会发出警告
    在这里插入图片描述
    虽然去掉WINAPI对编译和运行并不造成影响,但为了安全起见和养成良好的习惯还是加上。
    这个函数重复了一万遍还要再重复写一次
    int WINAPI (In HINSTANCE hInstance,//句柄,一个数,不是指针,就是一串数字,类比身份证号
    In HINSTANCE hPrevInstance,//前置句柄,一个Microsoft这么多年都无法删除的毫无存在的参数
    In LPSTR lpCmdLine,//命令行,字符串,最简单的举例就是双击桌面图标这个值就是一串本地地址
    In int nCmdShow);//窗口显示类型,最大化最小化图标化,隐藏等
    nCmdShow如下:
    SW_HIDE 隐藏并激活并一个窗口
    SW_MAXIMIZE 最大化
    SW_MINIMIZE 最小化
    SW_RESTORE 激活并恢复原尺寸
    SW_SHOW 以当前尺寸和位置激活并显示窗口
    SW_SHOWMAXIMIZE 激活并最大化
    SW_SHOWMINIMIZE 激活并最小化
    SW_SHOWNA 以当前尺寸和位置显示但不激活窗口
    SW_SHOWMINNOACTIVE 最小化显示窗口不激活
    SW_SHOWNOACTIVE 恢复原尺寸显示窗口但不激活
    SW_SHOWNORMAL 正常显示窗口

    _In_表示外界向函数输入数据的意思
    #define In SAL2_Source(In, (), Pre1_impl(__notnull_impl_notref) Pre_valid_impl Deref_pre1_impl(__readaccess_impl_notref))

    有时候还是不要把时间浪费在没意义的事情上,比如拼命想搞懂_In_ 后面那一串是什么,这个我只看到pre1_impl跟踪到后面好像是一个结构体,总之现在没时间看了,以后有空有兴趣再来补充吧。
    int WINAPI MessageBox(In_opt HWND hWnd,//附属窗口的句柄,填NULL则默认给桌面
    In_opt LPCTSTR lpText,//内容文字
    In_opt LPCTSTR lpCaption,//标题文字
    In UINT uType);//窗口显示类型
    uType目前提供的样式如下:
    #define MB_OK 0x00000000L:
    在这里插入图片描述
    #define MB_OKCANCEL 0x00000001L:
    在这里插入图片描述
    #define MB_ABORTRETRYIGNORE 0x00000002L:
    在这里插入图片描述
    #define MB_YESNOCANCEL 0x00000003L:
    在这里插入图片描述
    #define MB_YESNO 0x00000004L:
    在这里插入图片描述
    #define MB_RETRYCANCEL 0x00000005L:
    在这里插入图片描述
    #define MB_CANCELTRYCONTINUE 0x00000006L:在这里插入图片描述
    可以和标识符结合例如MB_OK| MB_ICONHAND
    结果是:
    在这里插入图片描述

    标志符如下:
    #define MB_ICONQUESTION 0X00000020L
    在这里插入图片描述
    #define MB_ICONEXCLAMATION 0X00000030L
    在这里插入图片描述
    #define MB_ICONASTERISK 0X00000040L
    在这里插入图片描述
    _In_opt 表示选填,也就是写NULL也可以的意思

    返回值即按下按钮之后的int值
    常见的int值如下:
    #define IDOK 1
    #define IDCANCEL 2
    #define IDABORT 3
    #define IDRETRY 4
    #define IDIGNORE 5
    #define IDYES 6
    #define IDNO 7

    展开全文
  • 最简单的winmain程序 #include #include LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { HDC hdc; switch(uMsg) { case WM_CHAR: char szChar[20]; sprintf(szChar,...
  • WinMain函数如下: #include <windows.h> #include <stdio.h> //消息是由MSG结构体来表示的。 LRESULT CALLBACK WinSunProc( HWND hwnd, // handle to window表示消息所属的窗口 UINT uMsg, /...

    目录

    WinMain程序如下:

    接下:VC++关于WinMain程序的学习笔记(2)

    原文:VC++关于WinMain程序的学习笔记(1)


    WinMain程序如下:

    #include <windows.h>
    #include <stdio.h>
    
    	//消息是由MSG结构体来表示的。
    LRESULT CALLBACK WinSunProc(
    	HWND hwnd,  		// handle to window表示消息所属的窗口
    	UINT uMsg,    		// message identifier指定了消息的标识符
    	WPARAM wParam,		// first message parameter指定消息的附加信息
    	LPARAM lParam 		// second message parameter指定消息的附加信息
    );
    
    	//WinMain是Windows程序的入口点函数。
    int WINAPI WinMain(
    	HINSTANCE hInstance,  		// handle to current instance该程序当前运行的实例的句柄
    	HINSTANCE hPrevInstance,		// handle to previous instance当前实例的前一个实例的句柄
    	LPSTR lpCmdLine,       		// command line一个以空终止的字符串,指定传递给应用程序的命令行参数。
    	int nCmdShow           			// show state指定程序的窗口应该如何显示
    )
    
    {
    	//窗口的特征就是由WNDCLASS结构体来定义的。
    	//设计一个窗口类
    	WNDCLASS wndcls;
    	wndcls.cbClsExtra = 0; //为系统中的每一个窗口类管理一个 WNDCLASS 结构。不应使用(应为零)
    	wndcls.cbWndExtra = 0; //为每一个窗口管理一个内部数据结构,不应使用(应为零)
    	wndcls.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); //hbrBackground指定窗口类的背景画刷句柄。背景色
    	wndcls.hCursor = LoadCursor(NULL, IDC_ARROW); //hCursor 指定窗口类的光标句柄。当鼠标悬停在窗口上时的游标
    	wndcls.hIcon = LoadIcon(NULL, IDI_QUESTION); //hIcon指定窗口类的图标句柄。框架窗口的图标
    	wndcls.hInstance = hInstance; //hInstance指定包含窗口过程的程序的实例句柄。自动填充 AfxGetInstanceHandle,应用程序实例句柄由WinMain函数传进来
    	wndcls.lpfnWndProc = WinSunProc; //函数指针,指向窗口过程函数。窗口进程,必须是 AfxWndProc
    	wndcls.lpszClassName = "have a happy day"; // lpszClassName 是一个以空终止的字符串,指定窗口类的名字。类名
    	wndcls.lpszMenuName = NULL; //lpszMenuName是一个以空终止的字符串,指定菜单资源的名字。不应使用(应为NULL)
    	wndcls.style = CS_HREDRAW | CS_VREDRAW;//style指定这一类型窗口的样式,当窗口水平方向垂直方向上的高度发生变化时,将重新绘制整个窗口。
    	
    	//在设计完窗口类(WNDCLASS)后,需要调用 RegisterClass 函数对其进行注册,在注册成功后,才可以创建该类型的窗口。
    	RegisterClass(&wndcls);
    	
    	//创建窗口,定义一个变量用来保存成功创建窗口后返回的句柄
    	HWND hwnd;
    	hwnd = CreateWindow("have a happy day", "hello",
    		WS_OVERLAPPEDWINDOW, 10, 10, 500, 500, NULL, NULL, hInstance, NULL);
    
    	//显示及刷新窗口
    	ShowWindow(hwnd, SW_SHOWNORMAL);
    	UpdateWindow(hwnd);
    
    	//定义消息结构体,开始消息循环
    	MSG msg;
    	BOOL bRet;
    	//while (GetMessage(&msg, NULL, 0, 0))
    	while ((bRet = GetMessage(&msg, hwnd, 0, 0)) != 0)
    	{
    		if (bRet == -1)
    		{
    			// handle the error and possibly exit
    			return -1;
    		}
    		else
    		{
    			TranslateMessage(&msg);//用于将虚拟键消息转换为字符消息。
    			DispatchMessage(&msg);//分派一个消息到窗口过程,由窗口过程函数对消息进行处理。
    		}	
    	}
    	return msg.wParam;
    }
    
    //编写窗口过程函数
    LRESULT CALLBACK WinSunProc(
    	HWND hwnd,  		// handle to window,消息的窗口句柄
    	UINT uMsg,   		// message identifier,消息代码
    	WPARAM wParam,	// first message parameter,消息代码的附加参数
    	LPARAM lParam 		// second message parameter,消息代码的附加参数
    )
    {
    	switch (uMsg)
    	{
    	case WM_CHAR://当用户在窗口中按下一个字符键,程序将得到一条WM_CHAR消息
    		char szChar[20];
    		sprintf_s(szChar, sizeof(szChar), "char code is %d", wParam);
    		MessageBox(hwnd, szChar, "char", 0);//弹出一个包含了显示信息的消息框
    		break;
    	case WM_LBUTTONDOWN://当用户在窗口中按下鼠标左键时,将产生WM_LBUTTONDOWN消息调用MessageBox,函数弹出一个提示信息,告诉用户“点击了鼠标”
    		MessageBox(hwnd, "mouse clicked", "message", 0);
    		HDC hdc;//定义了一个类型为HDC的变量hdc
    		hdc = GetDC(hwnd);//用hdc保存GetDC函数返回的与特定窗口相关联的DC的句柄。不能在响应WM_PAINT消息时调用
    		TextOut(hdc, 0, 50, "HAVE A NICE DAY!", strlen("HAVE A NICE DAY!"));//TextOut函数利用得到的DC句柄在指定的位置(x坐标为0,y坐标为50)输出一行文字
    		ReleaseDC(hwnd, hdc);//如果使用GetDC函数来得到DC的句柄,那么在完成图形操作后,必须调用ReleaseDC函数来释放DC所占用的资源,否则会引起内存泄漏。
    		break;
    	case WM_PAINT://对WM_PAINT消息进行处理。当窗口客户区的一部分或者全部变为“无效”时,系统会发送WM_PAINT消息,通知应用程序重新绘制窗口。
    		HDC hDC;
    		PAINTSTRUCT ps;
    		hDC = BeginPaint(hwnd, &ps);//调用BeginPaint函数得到DC的句柄。BeginPaint函数的第1个参数是窗口的句柄,第二个参数是PAINTSTRUCT结构体的指针,该结构体对象用于接收绘制的信息。BeginPaint只能在响应WM_PAINT消息时调用
    		TextOut(hDC, 0, 0, "https://blog.csdn.net/qq_44974888/article/details/124137129?spm=1001.2014.3001.5501", strlen("https://blog.csdn.net/qq_44974888/article/details/124137129?spm=1001.2014.3001.5501"));//TextOut函数在(0,0)的位置输出一个网址
    		EndPaint(hwnd, &ps);//BeginPaint函数得到的DC,必须用EndPaint函数去释放
    		break;
    	case WM_CLOSE://当用户单击窗口上的关闭按钮时,系统将给应用程序发送一条WM_CLOSE 消息。
    		if (IDYES == MessageBox(hwnd, "是否退出程序?", "warning", MB_YESNO))
    		{
    			DestroyWindow(hwnd);//调用DestroyWindow函数销毁窗口
    		}//DestroyWindow 函数在销毁窗口后会向窗口过程发送 WM_DESTROY 消息。注意,此时窗口虽然销毁了,但应用程序并没有退出。
    		break;
    	case WM_DESTROY://DestroyWindow函数在销毁窗口后,会给窗口过程发送WM_DESTROY消息,在该消息的响应代码中调用PostQuitMessage函数
    		PostQuitMessage(0);//PostQuitMessage函数向应用程序的消息队列中投递一条WM_QUIT消息并返回
    		break;//GetMessage函数只有在收到WM_QUIT消息时才返回0,此时消息循环才结束,程序退出
    	default:
    		return DefWindowProc(hwnd, uMsg, wParam, lParam);//对WM_CLOSE消息的响应并不是必须的,如果应用程序没有对该消息进行响应,系统将把这条消息传给DefWindowProc函数,那么DefWindowProc函数则调用DestroyWindow函数来响应这条WM_CLOSE消息。
    	}
    	return 0;
    }
    

    接下:VC++关于WinMain程序的学习笔记(2)

    原文:VC++关于WinMain程序的学习笔记(1)

    展开全文
  • 关于VC6.0中 运行错误 unresolved external symbol _WinMain@16的解决
  • WinMain

    2007-10-15 06:20:28
    一个WinMain程序,About对话框有问题,产生的不对!
  • win:golang winmain

    2021-05-29 20:18:03
    ohisama/win什么是: golang 上的 Windows WinMain安装: download zipextract zipcopy win.go c:\Go\src\pkg\ohisama\wincd srcgo run main.go执照: 麻省理工学院执照作者: 黑田龙提
  • WinMain,应用程序入口点

    千次阅读 2021-05-20 01:02:22
    每个 Windows 程序都有一个类似 main 函数的入口函数,名字叫做 WinMain 或者 wWinMain , 其声明如下:int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);...

    每个 Windows 程序都有一个类似 main 函数的入口函数,名字叫做 WinMain 或者 wWinMain , 其声明如下:int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);

    该函数有四个参数:hInstance 参数的含义是一个实例句柄,或者是一个模块句柄。该参数代表被加载到内存的可执行程序(exe文件)。某些 Windows API 可能需要该参数。如:加载图标或者加载位图等等。

    hPrevInstance 该参数无意义,它在过去的16位操作系统中被使用,现在永远为0。

    pCmdLine 该参数是程序传入的命令行参数,和 main 函数中的 argv 参数含义类似,只不过现在的字符集是 Unicode。

    nCmdShow 该参数是一个整数,代表应用程序主窗口的显示状态,是最小化、最大化还是正常显示。

    这个函数返回一个整形值,这个返回值没有被操作系统使用,但是你可以通过改返回值判断程序的一些运行状态,或者将此值传递给另一个程序。

    WINAPI 是一种调用约定。这个约定确保函数从调用者那里接收参数的相关规则,例如,参数在栈中保存的顺序等等。在写代码的时候一定不要忘记该约定的标识。

    WinMain 和 wWinMain 默认是等价的,除非命令行参数是一个 ANSI 字符串,Unicode 版本永远是首选。如果是 Unicode 版本,你可以传递一个 ANSI 字符串,反之则不行。

    你可以通过 GetCommandLine 函数获取命令行参数,这个函数返回一个单一的字符串。如果你想获取参数的数组样式,可以通过 CommandLineToArgvW 函数完成。

    编译器是怎样知道调用 wWinMain 还是调用标准的 main 函数?

    实际情况下,在微软的 C 运行时库(CRT)中提供了一个 main 函数实现,其内部会调用 WinMain 或者 wWinMain。CRT 中 main 函数的内部在调用 wWinMain 之前做了一些额外的工作,例如初始化一些静态成员或者其它 C 函数的初始化操作等等。虽然你可以手动指定不同的链接不同的入口函数,但是仍然推荐你使用 CRT 默认提供的入口点函数,否则 CRT 内部的一些代码将被会跳过,有可能会导致一些异常的结果。

    下面是一个空的 WinMain 函数。INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

    PSTR lpCmdLine, INT nCmdShow)

    {

    return 0;

    }

    上面已经介绍了一些 Windows 开发的基本知识,接下来就准备创建我们的第一个 Windows 程序。

    展开全文
  • 进入 WinMain 函数、 设计窗口类、 注册窗口类、 产生窗口、 显示窗口、 更新窗口, 最后进入消息循环,将消息路由给窗口过程函数去处理。 遵循这条主线,我们在写程序时就有了一条很清晰的脉络。 ...
  • 03 WinMain函数

    2021-03-27 18:53:03
    WinMain函数是Windows程序的入口函数。相当于C语言程序的main函数,当 WinMain结束或返回时, Windows程序结束。 函数原型 int CALLBACK WinMain( _In_ HINSTANCE hInstance, //应用程序实例句柄 _In_opt_ ...
  • WinMain的基本流程

    千次阅读 2018-07-08 16:12:50
    一、WinMain入口点我们在学习标准C++的时候,都知道每个应用程序运行时都会先进入入口点函数main,而当从main函数跳出时程序就结束了。在Windows编程里面,也是一样的,只是我们的入口点函数不叫main,叫WinMain...
  • WinMain_Vc_

    2021-10-01 12:52:38
    VC++窗口及句柄原理的源码,程序运行原理及程序编写流程,窗口产生过程,句柄原理,消息队列,回调函数,窗口关闭与应用程序退出的工作关系
  • WinMain.rar_visual c

    2022-07-14 07:16:03
    屏幕保护程序 用sdk写的 是图像变幻 及其颜色变换
  • 只要将文件中的int main改为int winmain就会报错,原文件后缀是.cpp都是按照其他人的程序写的,别人都是直接就运行了,就我一直报这个错误,网上找了很久,都没有找到解决方案!麻烦帮忙解答下,顺便说说解决办法!...
  • int WINAPI WinMain( HINSTANCE hInstance, //应用程序当前实例的句柄 HINSTANCE hPrevInstance, //应用程序的先前实例的句柄。同一个程序打开两次,出现两个窗口, 第一次打开的窗口就是先前实例的窗口。 对于一个32...
  • 项目是动态库dll,改为应用程序(.exe)后出现了“无法解析的外部符号 _WinMain@16”的错误,解决办法: (1)项目->属性->配置属性->C/C++ ->预处理器 中的【预处理器定义】 删除“_CONSOLE” 添加 “ _...
  • 本文实例讲述了VC外部符号错误_main,_WinMain@16,__beginthreadex解决方法。分享给大家供大家参考。具体如下:在创建MFC项目时, 不使用MFC AppWizard向导, 如果没有设置好项目参数,就会在编译时产生很多连接错误, 如...
  • main函数和WinMain 函数

    2021-06-18 16:18:03
    main函数和WinMain 函数是分别做为CUI和GUI的进入点函数被使用的。 但请注意一点,OS 本身不会调用我们编写的进入点函数(main 或WinMain),它调用的是 C/C++运行期启动函数。 ———————————————— ...
  • 满意答案qq9783268552013.06.12采纳率:53%等级:11已帮助:3414人int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow );参数:WinMain函数接收4个参数,这些参数都是...
  • // TODO: 在此处添加构造代码, // 将所有重要的初始化放置在 InitInstance 中 } 程序执行的顺序:theApp全局对象定义处、CTestApp构造函数、WinMain函数。 在程序入口main函数加载时,系统就已经为全局变量或...
  • MFC的WinMain在哪呢

    2021-09-25 07:44:45
    Win32应用程序的入口是WinMain(),而在MFC中却找不到WinMain函数,这个家伙究竟去了哪里了呢? 在MFC中最开始的操作往往是这样的: 先定义一个全局的theApp,比如CWinTestApp theApp;这一步会调用到CWinTestApp的构造函数...
  • 64-w64-mingw32/lib/../lib/libmingw32.a(lib64_libmingw32_a-crt0_c.o):crt0_c.c:(.text.startup+0x2e): undefined reference to `WinMain' collect2.exe: error: ld returned 1 exit status [Done] exited with ...
  • WinMain的编写

    2013-04-05 20:08:43
    WinMain的编写
  • 扩展资料: 注意事项 ‘WinMain@16’”这里的真实错误所引起,所以只需关注前面出现了什么错误,将其改正就可以了。 退出状态(exit status)错误仅表示构建过程中的链接步骤遇到一些错误。通常退出状态为 0 表示...
  • 当程序调用了CWinApp类的构造函数,并执行了CTestApp类的构造函数,且产生了theApp 对象之后,接下来就进入 WinMain 函数。根据如下所示代码,可以发现WinMain函数实际上是通过调用AfxWinMain函数来完成它的功能的。...
  • 在使用GLut进行计算机图形学实验的时候,出现了undefined reference to 'WinMain@16'的情况试过了两位博主的方法 链接:codeblocks中undefined reference to 'WinMain@16'的问题_任福汉的博客-CSDN博客 链接:出现...
  • error LNK2019: 无法解析的外部符号 WinMain,error LNK2001: 无法解析的外部符号 WinMain,error LNK1120: 1 个无法解析的外部命令
  • winMain函数

    千次阅读 2019-03-24 20:08:11
    WinMain函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) 函数名:WinMain() 返回值:int,WINAPI 参数类型: hInstance:HINSTANCE 是“句柄型”数据类型。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,542
精华内容 16,616
关键字:

WinMain