windows编程 窗口全屏无边框时设置浮动栏(带有最小化按钮和退出按钮)退出全屏

悬浮框的代码是参考freerdp实现的。
请指出错误或者提供解决代码,谢谢
//=============================
#include
#include "resource.h"

typedef struct wf_context wfContext;
typedef struct _Button Button;
typedef struct _FloatBar FloatBar;

/* Button Type */
#define BUTTON_MINIMIZE 1 //最小化
#define BUTTON_CLOSE 2 //关闭
#define BTN_MAX 2 //

/* bmp size */ //位置参数初始化
#define BACKGROUND_W 80
#define BACKGROUND_H 29
#define MINIMIZE_X (BACKGROUND_W - 64)
#define CLOSE_X (BACKGROUND_W - 37)

#define BUTTON_Y 2
#define BUTTON_WIDTH 24
#define BUTTON_HEIGHT 24

struct wf_context
{
HWND hwnd;
HINSTANCE hInstance;
FloatBar* floatbar;
};

struct _Button {
FloatBar* floatbar;
int type;
int x, y, h, w;
HBITMAP bmp;
};

struct _FloatBar {
HWND parent;
HWND hwnd;
RECT rect;
LONG widthh;
LONG heightt;
wfContext* wfc;
Button* buttons[BTN_MAX];
HDC hdcmem;
HBITMAP background;
};

static int button_paint(Button* button, HDC hdc)//浮动栏按钮实现代码
{
FloatBar* floatbar = button->floatbar;
SelectObject(floatbar->hdcmem,button->bmp);
StretchBlt(hdc, button->x, button->y, button->w, button->h, floatbar->hdcmem, 0, 0, button->w, button->h, SRCCOPY);

return 0;

}
static int floatbar_paint(FloatBar* floatbar, HDC hdc)//浮动栏的绘制实现代码,包括背景条和按钮的绘制
{
int i;
/* paint background */
SelectObject(floatbar->hdcmem, floatbar->background);
StretchBlt(hdc, 0, 0, BACKGROUND_W, BACKGROUND_H, floatbar->hdcmem, 0, 0, BACKGROUND_W, BACKGROUND_H, SRCCOPY);

/* paint buttons */
for (i = 0;i < BTN_MAX; i++)
    button_paint(floatbar->buttons[i], hdc);

return 0;

}

static Button* floatbar_create_button(FloatBar* floatbar, int type, int resid, int x, int y, int h, int w)//浮动栏按钮位图加载实现代码
{
Button *button;
button = (Button *)malloc(sizeof(Button));

if (!button)
    return NULL;

button->floatbar = floatbar;
button->type = type;
button->x = x;
button->y = y;
button->w = w;
button->h = h;

button->bmp = (HBITMAP)LoadImage(floatbar->wfc->hInstance, MAKEINTRESOURCE(resid), IMAGE_BITMAP, w, h, LR_DEFAULTCOLOR);

return button;

}
static FloatBar* floatbar_create(wfContext* wfc)///浮动栏背景位图和按钮位图加载
{
FloatBar* floatbar;

floatbar = (FloatBar *)malloc(sizeof(FloatBar));

if (!floatbar)
    return NULL;
floatbar->hwnd = NULL;
floatbar->parent = wfc->hwnd;
floatbar->wfc = wfc;
floatbar->hdcmem = NULL;

//浮动栏按钮绘制     背景绘制、最小化、恢复、关闭,置顶 z2015-7-27 14:25:13
floatbar->background = (HBITMAP)LoadImage(wfc->hInstance, MAKEINTRESOURCE(IDB_BACKGROUND), IMAGE_BITMAP, BACKGROUND_W, BACKGROUND_H, LR_DEFAULTCOLOR);
floatbar->buttons[0] = floatbar_create_button(floatbar, BUTTON_MINIMIZE, IDB_MINIMIZE, MINIMIZE_X, BUTTON_Y, BUTTON_HEIGHT, BUTTON_WIDTH);
floatbar->buttons[1] = floatbar_create_button(floatbar, BUTTON_CLOSE, IDB_CLOSE, CLOSE_X, BUTTON_Y, BUTTON_HEIGHT, BUTTON_WIDTH);
return floatbar;

}

static Button* floatbar_get_button(FloatBar* floatbar, int x, int y)///获取鼠标横纵坐标,判断鼠标是否点到按钮
{
int i;
if (y > BUTTON_Y && y < BUTTON_Y + BUTTON_HEIGHT)
for (i = 0; i < BTN_MAX; i++)
if (x > floatbar->buttons[i]->x && x < floatbar->buttons[i]->x + floatbar->buttons[i]->w)
return floatbar->buttons[i];

return NULL;

}
LRESULT CALLBACK floatbar_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)//过程函数
{
static int dragging = FALSE;
static int lbtn_dwn = FALSE;
static int btn_dwn_x = 0;
static FloatBar* floatbar;
static TRACKMOUSEEVENT tme;

PAINTSTRUCT ps;
Button* button;
HDC hdc;
int pos_x;
int pos_y;

int xScreen = GetSystemMetrics(SM_CXSCREEN);

switch(Msg)
{
    case WM_CREATE:
        floatbar = (FloatBar *)((CREATESTRUCT *)lParam)->lpCreateParams;
        floatbar->hwnd = hWnd;
        floatbar->parent = GetParent(hWnd);

        GetWindowRect(floatbar->hwnd, &floatbar->rect);
        floatbar->widthh = floatbar->rect.right - floatbar->rect.left;
        floatbar->heightt = floatbar->rect.bottom - floatbar->rect.top;

        hdc = GetDC(hWnd);
        floatbar->hdcmem = CreateCompatibleDC(hdc);
        ReleaseDC(hWnd, hdc);

        tme.cbSize = sizeof(TRACKMOUSEEVENT);
        tme.dwFlags = TME_LEAVE;
        tme.hwndTrack = hWnd;
        tme.dwHoverTime = HOVER_DEFAULT;
        break;

    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        floatbar_paint(floatbar, hdc);
        EndPaint(hWnd, &ps);
        break;

    case WM_LBUTTONDOWN:
        pos_x = lParam & 0xffff;
        pos_y = (lParam >> 16) & 0xffff;

        button = floatbar_get_button(floatbar, pos_x, pos_y);
        if (!button)
        {
            SetCapture(hWnd);
            dragging = TRUE;
            btn_dwn_x = lParam & 0xffff;
        }
        else
            lbtn_dwn = TRUE;

        break;

    case WM_LBUTTONUP:
        pos_x = lParam & 0xffff;
        pos_y = (lParam >> 16) & 0xffff;

        ReleaseCapture();
        dragging = FALSE;
        if (lbtn_dwn)
        {
            button = floatbar_get_button(floatbar, pos_x, pos_y);

////=======================================
switch (button->type)
{
case BUTTON_MINIMIZE: //最小化 //浮动栏的按钮 功能实现 2015-7-27 09:00:07
ShowWindow(floatbar->parent, SW_MINIMIZE);
break;
case BUTTON_CLOSE: //关闭
SendMessage(floatbar->parent, WM_DESTROY, 0 , 0);
break;
default:
return 0;
}
////=======================================
lbtn_dwn = FALSE;
}
break;

    case WM_DESTROY:
        DeleteDC(floatbar->hdcmem);
        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hWnd, Msg, wParam, lParam);
}
return 0;

}

///=========================================================================
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{

WNDCLASSEX wnd_cls; //这个类把floatbar所有的属性赋在窗口上
HWND barWnd;
MSG     msg ;
int x = (GetSystemMetrics(SM_CXSCREEN) - BACKGROUND_W) / 2;

wnd_cls.cbSize        = sizeof(WNDCLASSEX);
wnd_cls.style         = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
//WNDCLASS函数
wnd_cls.lpfnWndProc   = floatbar_proc;//进程?
wnd_cls.cbClsExtra    = 0;
wnd_cls.cbWndExtra    = 0;
wnd_cls.hIcon         = LoadIcon(NULL, IDI_APPLICATION);//
wnd_cls.hCursor       = LoadCursor(NULL, IDC_ARROW);
wnd_cls.hbrBackground = NULL;
wnd_cls.lpszMenuName  = NULL;
wnd_cls.lpszClassName = "floatbar";
wnd_cls.hInstance     = hInstance;
wnd_cls.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&wnd_cls);

if (!RegisterClass (&wnd_cls))  {           
      MessageBox (NULL, "窗口注册失败!", "floatbar", 0) ;
      return 0 ;
 }
wfContext* wfc;//报错
wfcc->hInstance=hInstance;//报错
wfcc->floatbar = floatbar_create(wfcc); //报错
//生成浮动栏
barWnd =CreateWindowExW(WS_EX_TOPMOST, "floatbar", NULL, WS_CHILD, x, 0, BACKGROUND_W, BACKGROUND_H, NULL, NULL, hInstance, wfc->floatbar);
if (barWnd == NULL)
    return;
ShowWindow(barWnd, SW_SHOWNORMAL);//


 while (GetMessage (&msg, NULL, 0, 0))  {
    TranslateMessage (&msg) ;           
        DispatchMessage (&msg) ;        
 }
 return msg.wParam ;

}

////====================================================================================

图片

0

1个回答

1
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Electron 无边框窗口最大化最小化关闭功能
目的n实现无边框窗口,并添加最大化最小化和关闭功能前提n了解Electron 主进程和渲染进程的通讯n了解 BrowserWindow相关功能操作流程nn1.首先创建一个无边框的Window窗口nn创建win的时候指定frame:falsennnvar win = new BrowserWindow({n transparent: true,n frame: falsen})nnn2.在界面上...
qt creator全屏,没有工具栏和最大最小化的解决办法
nn如果出现图中的情况,应该不小心把qt creator设置成全屏了。只要同时按下shift键+Ctrl键+F11,就可以取消全屏了。nn
QT实现无边框窗体的最小化,最大化/还原,关闭,拖动和双击最大化等功能
QT实现无边框窗体的最小化,最大化/还原,关闭,拖动和双击最大化等功能
VC++MFC单文档全屏
VC++MFC单文档全屏,设置全屏图标和菜单,全屏后设置浮动按钮退出全屏。
JavaFX窗口状态设置
窗口最大化显示、始终显示在其他窗口之上、全屏显示,Esc退出、最小化,任务栏可见图标、设置窗口风格
[乱说]Electron 无边框窗口最大化最小化关闭功能
Electron 无边框窗口最大化最小化关闭功能目的rn实现无边框窗口,并添加最大化最小化和关闭功能rn前提rn了解Electron 主进程和渲染进程的通讯rn了解 BrowserWindow相关功能rn操作流程rn先在界面上放三个按钮rn <body style="-webkit-app-region: drag">rn <section style="-webkit-app-region: drag"
Qt:QML:程序最大化最小化全屏之间的切换
啥也不说了,直接上代码import QtQuick 2.5nimport QtQuick.Controls 1.4nimport QtQuick.Window 2.0ApplicationWindow {n id:idMainWindown visible: truen width: 640n height: 480n title: qsTr("Test") Ch
Unity Pc应用窗口的最小化,最大化,关闭
Unity Pc应用窗口的最小化,最大化,关闭 的实现最近写项目用到的,分享给大家。 nnn 即nnn闲话不多说了直接切入真题,代码如下: nn #region 窗口最小化定义n [DllImport(&quot;user32.dll&quot;)]n static extern bool CloseWindow(IntPtr hwnd);n [DllImport(&quot;user32.dl...
MFC对话框重绘-标题栏,最大化,最小化,关闭,边框
MFC对话框的重绘,包括标题栏、最小化按钮,最大化按钮,关闭按钮以及边框等的重绘
wpf 双击事件及全屏和退出全屏
作为一个新手,大家不要乱喷,高手勿进。嘿嘿 n最近在做一个win7的cs软件,可是把窗口拖动到边框上就会让窗口全屏,并且不能自动退出全屏,没有办法就百度了,大概有两种方法, n1、就是修改注册表把win7的这个功能给禁用了,百度的例子很多,当时我也想用,想在程序启动的时候就后台修改注册表,来达到这样的目的。 n2、就是响应一些事件,来手动退出,比如按下ESC,和双击标题栏来达到这样的效果, n我选择
C# 笔记4——如何实现单击放大全屏和退出全屏
C# 笔记4——如何实现单击放大全屏和退出全屏nn由于工作需求,需要实现单击放大和退出全屏功能,想了一下,即单击放大时候把播放视频的picturebox的大小设置和屏幕宽高相同、位置设置为屏幕左上角(0,0)即可,单击退出全屏时候把控件大小和位置恢复到初始位置即可。n需要注意的是若控件在某一个panel中,也需要如上设置panel的位置和宽高,否则无法达到理想效果;对于需要全屏的控件最好将其
wpf mediaelement播放器。快进暂停停止打开文件全屏最小化,无边框窗体
mediaelement播放器 快进 暂停 停止 打开文件 全屏 最小化 无边框窗体
ubuntu:窗口/终端最大化或者全屏快捷键设置
窗口最大化:ctrl+win窗+↑n窗口还原:ctrl+win窗+↓nn也可以通过自定义快捷键添加nn1,打开“系统设置”==&amp;gt;“键盘”==&amp;gt;“自定义快捷键”nnnn nn分别自定义两个快捷键:nna)Full Terminalnn命令:gnome-terminal --full-screennnb)Max Terminalnn命令:gnome-terminal  --maximize...
系统MPMoviePlayerController点击全屏按钮横屏显示方法
系统播放器有自带的监听rn//将要进入全屏的通知rn    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterFullscreenScreen:) name: MPMoviePlayerWillEnterFullscreenNotification object:nil];rn   
Mac 开发中设置 关闭 以及最小化 最大化按钮事件处理
Xcode默认的向导生成的工程的带有关闭,最小化,最大化这几个按钮,rnrn关闭按钮的事件,最让窗口最小化到Dock中,但当你点击Dock却无法恢复,而在屏幕的顶部菜单中也不会多一个与你程序同名的“X-X-X”菜单项,这样的程序体验不好,如果提到App Store肯定也是会被拒的。rnrn当然你如果在程序起动的时候,首先不点击“关闭”按钮,而是点击最小化,你会发现菜单中的Window菜单栏中的最下
SecureCRT如何进入和退出全屏及调出菜单栏
今天不知道按到哪儿了,SecureCRT直接进入全屏了,有点捉急,网上找了下资料rnrnrn只需你点击Alt+enter键,就退出全屏了rnrnrnrn想重新进入全屏模式,也很简单,同样点击Alt+enter键,就行了
js 控制网页全屏及退出全屏
网上找了好多资料,基本大同小异,实际效果会出现IE不兼容的现象(全屏和退出全屏都失效), 后来解决了,记录如下:function requestFullScreen(element) {n    var docElm = element;n    if (docElm.requestFullscreen) {n        docElm.requestFullscreen();n    }els...
MFC 基于VLC的视频播放器(五)---全屏显示以及按钮函数的实现
北京时间16点43分 2018年12月28号nn前面的文章完成了双击播放列表播放文件以及播放时的时间轴显示,这次将实现全屏显示以及按钮函数的实现。nn对于全屏显示,想法是处理PICTURE控件的双击显示消息函数,但是发现在添加处理函数后,双击后程序并不响应消息函数。nn后来发现是libvlc自己就拦截处理了播放时控件双击函数,所以我们写的程序才没有响应。nn所以,想要实现双击全屏有两种方法:nn1...
【C#】C#winform 双击/按"F12"键全屏,按"Esc"键退出
private void Lottery_DBClick(object sender, EventArgs e)rn        {rn            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;// 设置边框为 Nonern            this.WindowState = FormWind
对无边框的QT窗体设置点击任务栏按钮最小化和还原事件
this-&amp;gt;setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinimizeButtonHint);nn//最小化nvoid showMinimized();n//最大化nvoid showMaximized();n//全屏nvoid showFullScreen();n//正常尺寸n...
【cocos2d-x 3.4】全屏显示窗口,隐藏标题栏
方法一 :首先,修改appDelegate::applicationDidFinishLaunching()n函数 auto director = Director::getInstance();n auto glview = director->getOpenGLView();n if(!glview) {n glview = GLViewImpl::create(
关于JS触发全屏和退出全屏的介绍
最近项目中用到了给一个div添加一个全屏模式,所以找了下关于JS的全屏触发和解除的事件来分享一下;rnrnrnrn前面写了一篇文章介绍js的全屏操作 rn在写判断全屏的地方有遗漏,这里单独拿出来再写一篇专门判断全屏的文章。rnrn判断浏览器是否支持requestFullscreenrnrn首先是一段判断浏览器是否支持h5全屏api(requestFullscreen)的代码,如下:rn
视频播放全屏时其它控件的隐藏以及还原
项目当中有播放视频监控的需求,并且需要全屏播放的功能,完成之后在此记录。rn其实就是布局控件和状态栏的隐藏与现实以及横竖屏的切换,代码如下:rn                    //如果竖屏,则设置为横屏rnif(mActivity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTR
Qt 在Mac下无边框后无法最大化和最小化解决方案
Qt 5.0以上mac版本一致存在这个bug,网上也有解决方案,一个是修改Qt源码重新编译,这个比较费事,另一个是将文件改为.mm后缀,使用oc代码: NSView* view = (NSView*)this-&amp;gt;winId(); NSWindow* wnd = [view window]; [wnd miniaturize:nil];这句代码好像在qt5.2中可以解决,然后我测试了之后的所有...
远程桌面连接_全屏问题
首先是windows环境下如何进入远程桌面nnwin + R 键 输入mstscnnn2.回车确定,出现以下界面,然后输入远程计算机的ip地址,点击连接nn n继续输入计算机名和密码即可登录n我们的重点来了,如何进行全屏和非全屏的模式切换n快捷键:ctrl + alt + break 进行切换
Xshell 使用技巧
短文中介绍了Xshell的一些小技巧,包括:(1)点击复制黏贴操作;(2)如何优雅的分类各个项目;(3)快捷链接的使用;(4)多窗口命令使用;(5)Xshell中传输和接收文件;(6)全屏的快捷操作
bat中自动进入全屏模式或最小化模式
bat中自动进入全屏模式或最小化模式 注意:最小化模式中,可以删掉第二行的&&mode con cols=15 lines=1使窗口不变小。
C#窗体程序实现全屏及取消全屏
由于项目需要,需要用vs窗体程序实现播放视频的窗口的全屏和取消全屏。具体实现界面如图:nn n n注:为了界面的美观我的全屏并没有把左边的那些控件也盖住,但是是可以设置的,下边代码部分我会进行讲解。nn1、首先说明一下我所用的控件及我的项目中控件的名称,以便大家理解。 n 显示视频的黑框是一个picturebox即代码中的VideoPlayWnd,全屏/取消全屏是一个button即代码中...
js浏览器-BOM的内置对像操作 页面的全屏 后退
点击我可以穿件一个新的页面n 点击我可以关闭本页面n 点击我跳转到百度n n //新窗口 = window.open(地址,是否开新窗口,新窗口的参数);n var a1 = document.getElementsByTagName
JS实现HTML中frameset浏览器全屏和退出全屏
/*n 全屏n */n function fullScreen() { n var el = document.documentElement; n var rfs = el.requestFullScreen || el.webkitRequestFullScreen || el.mozRequestFullScreen || e
vue-video-player,通过自定义按钮组件实现全屏切换效果
最近公司的产品上线,一些高级功能在基础版本中不对用户开发,通过视频的形式展示。n产品开发用的是 vue, 经同事介绍使用了 vue-video-player 视频播放插件,通过 demo案例很快实现了视频播放效果nn&amp;lt;video-playern class=&quot;vjs-custom-skin&quot;n ref=&quot;videoPlayer1&quot;n :options=&quot;playerOpti...
gnome 应用窗口 关闭、最小化、最大化 按钮的位置设置
ubuntu 18.04 中Tweaks中可以设置左边和右边:nn nn nn nndebian 9 的Tweaks中只有是否显示最大化和最小化按钮,没有设置左边显示还是右边显示,可以通过dconf来修改:nnn$ sudo apt install dconf-editor n$ dconf-editor nnnn nn附 Tweaks安装:nnn$ sudo apt install gnome-...
JCVideoPlayerStandard点击全屏按钮崩溃
JCVideoPlayerStandard点击全屏按钮崩溃时出现崩溃,日志显示崩溃位置在hideSupportActionBar中出错,下面带,下面代码行出现了空指针异常ActionBar ab = JCUtils.getAppCompActivity(context).getSupportActionBar();发现它是要得到AppCompActivity而自己用的是FragmentActivit
postman退出全屏
      昨天在使用postman的时候不知道误碰到了什么,导致我的postman出现全屏。nnnn找了好久才发现,原来是误碰到了F11键,导致postman全屏。nn解决办法:nn     1.再次点击F11键即可。nnnn     2.在顶部菜单栏中选中View,再点击Toggle Full Screen即可nn nn ...
基于angular的退出全屏,全屏显示以及关闭系统
html中的代码:li class="dropdown" id="dropdown4">n a href="#" class="dropdown-toggle" data-toggle="dropdown" ng-bind="window">b class="caret">b>a>n ul class="dropdown-menu" ng-controller="screen">n
js实现全屏和退出全屏功能
主要是全屏和退出全屏事件,以及相应的操作(采用window.onresize监测)rn$(function(){rn //全屏rn $(&amp;quot;#fullScreen&amp;quot;).on(&amp;quot;click&amp;quot;,function(){rn fullScreen();rn })rn //退出全屏rn $(&amp;quot;#exitFullScreen&amp;quot;).on(&amp;quot;click&am
Unity打包PC端各种屏幕适配,无边框,最小化,显示可拖拽部分
本人Unity小白,刚刚开始工作,经常看大家写的博客,从中学习到了很多,也觉得这是一种自我提升的好办法,所以决定当在工作中解决了以前不会的,比较典型的问题时,写在这里与大家讨论与分享,代码写的不好,请多多指教。rn下面这个是Unity打包PC端之后,要满足每个场景需要不同的分辨率来显示,并且没有边框,在这里我参考了许多大家写的关于无边框的解决方法,但很多并不全面,下面贴出我写的代码,算是一个小小的
JS实现网页全屏与退出全屏
$('#alarm-fullscreen-toggler').on('click', function(e) {n var element = document.documentElement;n if (!$('body').hasClass("full-screen")) {n $('body').addClass("full-screen");n $('#alarm-fullsc
远程桌面退出全屏/不能全屏/全屏切换的技巧 笔记本电脑没有Break键怎么办
远程桌面退出全屏/不能全屏/全屏切换的技巧 笔记本电脑没有Break键怎么办
CVI面板全屏操作
函数使面板在载入时全屏:rnint ScreenPro (int panel)n{n int MonitorID = 0;n int height = 0;n int width = 0;n GetMonitorFromPanel (panel, &MonitorID);n GetMonitorAttribute (MonitorID, ATTR_HEIGHT, &height);n GetMon
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 ios开发视频全屏 乌班图退出python